Avoid attaching fqn annotations to live values that don't have a `__name__`.
authorA. Unique TensorFlower <gardener@tensorflow.org>
Tue, 20 Mar 2018 02:30:23 +0000 (19:30 -0700)
committerTensorFlower Gardener <gardener@tensorflow.org>
Tue, 20 Mar 2018 02:37:32 +0000 (19:37 -0700)
PiperOrigin-RevId: 189680937

tensorflow/contrib/py2tf/pyct/static_analysis/live_values.py
tensorflow/contrib/py2tf/pyct/static_analysis/live_values_test.py

index 0388be5..ac56979 100644 (file)
@@ -55,11 +55,13 @@ class LiveValueResolver(transformer.Base):
       if not symbol_is_local and not symbol_is_param:
         if node.id in self.literals:
           anno.setanno(node, 'live_val', self.literals[node.id])
-          # TODO(mdan): Could live values have FQNs? i.e. 'a'.join()
         elif node.id in self.context.namespace:
           obj = self.context.namespace[node.id]
           anno.setanno(node, 'live_val', obj)
-          anno.setanno(node, 'fqn', (obj.__name__,))
+          if hasattr(obj, '__name__'):
+            # If the symbol value is for example a primitive, then it will not
+            # have a name.
+            anno.setanno(node, 'fqn', (obj.__name__,))
         else:
           pass
           # TODO(mdan): Should we raise an error here?
index c133a45..a56dff8 100644 (file)
@@ -57,13 +57,26 @@ class LiveValuesResolverTest(test.TestCase):
 
   def test_literals(self):
 
+    a = None
+
     def test_fn():
-      return Foo  # pylint: disable=undefined-variable
+      return a
 
-    node = self._parse_and_analyze(test_fn, {}, {'Foo': 'bar'})
+    node = self._parse_and_analyze(test_fn, {}, literals={'a': 'bar'})
     retval_node = node.body[0].body[0].value
     self.assertEquals('bar', anno.getanno(retval_node, 'live_val'))
 
+  def test_primitive_values(self):
+
+    a = None
+
+    def test_fn():
+      return a
+
+    node = self._parse_and_analyze(test_fn, {'a': True})
+    retval_node = node.body[0].body[0].value
+    self.assertFalse(anno.hasanno(retval_node, 'fqn'))
+
   def test_namespace(self):
 
     def foo():