aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/python/util
diff options
context:
space:
mode:
authorGravatar IMBurbank <bassmanburbank@gmail.com>2018-09-25 18:39:11 -0600
committerGravatar IMBurbank <bassmanburbank@gmail.com>2018-09-25 18:39:11 -0600
commitf55e5ef27b3ccf1b75932e219f7358976dbf56c2 (patch)
tree5508a2b01492a41abf3452b992c8f7202053448a /tensorflow/python/util
parent081d9b7fa17fb9f4ea39b5ac5cc20432ae5d1756 (diff)
Update to use python 2-3 compatible function tf_inspect.getfullargspec.
Diffstat (limited to 'tensorflow/python/util')
-rw-r--r--tensorflow/python/util/tf_contextlib_test.py2
-rw-r--r--tensorflow/python/util/tf_inspect.py7
-rw-r--r--tensorflow/python/util/tf_inspect_test.py249
3 files changed, 244 insertions, 14 deletions
diff --git a/tensorflow/python/util/tf_contextlib_test.py b/tensorflow/python/util/tf_contextlib_test.py
index 4a5bf388a6..1e921b5ea3 100644
--- a/tensorflow/python/util/tf_contextlib_test.py
+++ b/tensorflow/python/util/tf_contextlib_test.py
@@ -83,7 +83,7 @@ class TfContextlibTest(test.TestCase):
self.assertFalse(isinstance(target, tf_decorator.TFDecorator))
def testGetArgSpecReturnsWrappedArgSpec(self):
- argspec = tf_inspect.getargspec(test_params_and_defaults)
+ argspec = tf_inspect.getfullargspec(test_params_and_defaults)
self.assertEqual(['a', 'b', 'c', 'd'], argspec.args)
self.assertEqual((2, True, 'hello'), argspec.defaults)
diff --git a/tensorflow/python/util/tf_inspect.py b/tensorflow/python/util/tf_inspect.py
index 967c872c2a..234850ac3f 100644
--- a/tensorflow/python/util/tf_inspect.py
+++ b/tensorflow/python/util/tf_inspect.py
@@ -43,7 +43,12 @@ def currentframe():
def getargspec(obj):
- """TFDecorator-aware replacement for inspect.getargspec.
+ """TFDecorator-aware replacement for `inspect.getargspec`.
+
+ This should not be called from other modules. It is deprecated in python3.
+
+ Use `getfullargspec`. It is a TFDecorator-aware replacement for
+ `inspect.getfullargspec` compatible with both python2 and python3.
Args:
obj: A function, partial function, or callable object, possibly
diff --git a/tensorflow/python/util/tf_inspect_test.py b/tensorflow/python/util/tf_inspect_test.py
index d3b7e4b969..55f88f8fc6 100644
--- a/tensorflow/python/util/tf_inspect_test.py
+++ b/tensorflow/python/util/tf_inspect_test.py
@@ -122,18 +122,6 @@ class TfInspectTest(test.TestCase):
self.assertEqual(argspec, tf_inspect.getargspec(partial_func))
- def testGetFullArgsSpecForPartial(self):
-
- def func(a, b):
- del a, b
-
- partial_function = functools.partial(func, 1)
- argspec = tf_inspect.FullArgSpec(
- args=['b'], varargs=None, varkw=None, defaults=None,
- kwonlyargs=[], kwonlydefaults=None, annotations={})
-
- self.assertEqual(argspec, tf_inspect.getfullargspec(partial_function))
-
def testGetArgSpecOnPartialInvalidArgspec(self):
"""Tests getargspec on partial function that doesn't have valid argspec."""
@@ -303,6 +291,243 @@ class TfInspectTest(test.TestCase):
self.assertEqual(argspec, tf_inspect.getargspec(NewClass))
+ def testGetFullArgSpecOnDecoratorsThatDontProvideFullArgSpec(self):
+ argspec = tf_inspect.getfullargspec(
+ test_decorated_function_with_defaults)
+ self.assertEqual(['a', 'b', 'c'], argspec.args)
+ self.assertEqual((2, 'Hello'), argspec.defaults)
+
+ def testGetFullArgSpecOnDecoratorThatChangesFullArgSpec(self):
+ argspec = tf_inspect.FullArgSpec(
+ args=['a', 'b', 'c'],
+ varargs=None,
+ varkw=None,
+ defaults=(1, 'hello'),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ decorator = tf_decorator.TFDecorator('', test_undecorated_function, '',
+ argspec)
+ self.assertEqual(argspec, tf_inspect.getfullargspec(decorator))
+
+ def testGetFullArgSpecIgnoresDecoratorsThatDontProvideFullArgSpec(self):
+ argspec = tf_inspect.FullArgSpec(
+ args=['a', 'b', 'c'],
+ varargs=None,
+ varkw=None,
+ defaults=(1, 'hello'),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ inner_decorator = tf_decorator.TFDecorator('', test_undecorated_function,
+ '', argspec)
+ outer_decorator = tf_decorator.TFDecorator('', inner_decorator)
+ self.assertEqual(argspec, tf_inspect.getfullargspec(outer_decorator))
+
+ def testGetFullArgSpecReturnsOutermostDecoratorThatChangesFullArgSpec(self):
+ outer_argspec = tf_inspect.FullArgSpec(
+ args=['a'], varargs=None, varkw=None, defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+ inner_argspec = tf_inspect.FullArgSpec(
+ args=['b'], varargs=None, varkw=None, defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ inner_decorator = tf_decorator.TFDecorator('', test_undecorated_function,
+ '', inner_argspec)
+ outer_decorator = tf_decorator.TFDecorator('', inner_decorator, '',
+ outer_argspec)
+ self.assertEqual(outer_argspec,
+ tf_inspect.getfullargspec(outer_decorator))
+
+ def testGetFullArgsSpecForPartial(self):
+
+ def func(a, b):
+ del a, b
+
+ partial_function = functools.partial(func, 1)
+ argspec = tf_inspect.FullArgSpec(
+ args=['b'], varargs=None, varkw=None, defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_function))
+
+ def testGetFullArgSpecOnPartialInvalidFullArgSpec(self):
+ """Tests getfullargspec.
+
+ Tests on partial function that doesn't have valid fullargspec.
+ """
+
+ def func(m, n, l, k=4):
+ return 2 * m + l + n * k
+
+ partial_func = functools.partial(func, n=7)
+
+ exception_message = (r"Some arguments \['l'\] do not have default value, "
+ "but they are positioned after those with default "
+ "values. This can not be expressed with ArgSpec.")
+ with self.assertRaisesRegexp(ValueError, exception_message):
+ tf_inspect.getfullargspec(partial_func)
+
+ def testGetFullArgSpecOnPartialValidFullArgSpec(self):
+ """Tests getfullargspec on partial function with valid fullargspec."""
+
+ def func(m, n, l, k=4):
+ return 2 * m + l + n * k
+
+ partial_func = functools.partial(func, n=7, l=2)
+ argspec = tf_inspect.FullArgSpec(
+ args=['m', 'n', 'l', 'k'],
+ varargs=None,
+ varkw=None,
+ defaults=(7, 2, 4),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialNoArgumentsLeft(self):
+ """Tests getfullargspec on partial function that prunes all arguments."""
+
+ def func(m, n):
+ return 2 * m + n
+
+ partial_func = functools.partial(func, 7, 10)
+ argspec = tf_inspect.FullArgSpec(
+ args=[], varargs=None, varkw=None, defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialKeywordArgument(self):
+ """Tests getfullargspec on partial function that prunes some arguments."""
+
+ def func(m, n):
+ return 2 * m + n
+
+ partial_func = functools.partial(func, n=7)
+ argspec = tf_inspect.FullArgSpec(
+ args=['m', 'n'], varargs=None, varkw=None, defaults=(7,),
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialKeywordArgumentWithDefaultValue(self):
+ """Tests getfullargspec.
+
+ Tests on partial function that prunes argument by keyword.
+ """
+
+ def func(m=1, n=2):
+ return 2 * m + n
+
+ partial_func = functools.partial(func, n=7)
+ argspec = tf_inspect.FullArgSpec(
+ args=['m', 'n'], varargs=None, varkw=None, defaults=(1, 7),
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialWithVarargs(self):
+ """Tests getfullargspec on partial function with variable arguments."""
+
+ def func(m, *arg):
+ return m + len(arg)
+
+ partial_func = functools.partial(func, 7, 8)
+ argspec = tf_inspect.FullArgSpec(
+ args=[], varargs='arg', varkw=None, defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialWithVarkwargs(self):
+ """Tests getfullargspec.
+
+ Tests on partial function with variable keyword arguments.
+ """
+
+ def func(m, n, **kwarg):
+ return m * n + len(kwarg)
+
+ partial_func = functools.partial(func, 7)
+ argspec = tf_inspect.FullArgSpec(
+ args=['n'], varargs=None, varkw='kwarg', defaults=None,
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnPartialWithDecorator(self):
+ """Tests getfullargspec on decorated partial function."""
+
+ @test_decorator('decorator')
+ def func(m=1, n=2):
+ return 2 * m + n
+
+ partial_func = functools.partial(func, n=7)
+ argspec = tf_inspect.FullArgSpec(
+ args=['m', 'n'], varargs=None, varkw=None, defaults=(1, 7),
+ kwonlyargs=[], kwonlydefaults=None, annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(partial_func))
+
+ def testGetFullArgSpecOnCallableObject(self):
+
+ class Callable(object):
+
+ def __call__(self, a, b=1, c='hello'):
+ pass
+
+ argspec = tf_inspect.FullArgSpec(
+ args=['self', 'a', 'b', 'c'],
+ varargs=None,
+ varkw=None,
+ defaults=(1, 'hello'),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ test_obj = Callable()
+ self.assertEqual(argspec, tf_inspect.getfullargspec(test_obj))
+
+ def testGetFullArgSpecOnInitClass(self):
+
+ class InitClass(object):
+
+ def __init__(self, a, b=1, c='hello'):
+ pass
+
+ argspec = tf_inspect.FullArgSpec(
+ args=['self', 'a', 'b', 'c'],
+ varargs=None,
+ varkw=None,
+ defaults=(1, 'hello'),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(InitClass))
+
+ def testGetFullArgSpecOnNewClass(self):
+
+ class NewClass(object):
+
+ def __new__(cls, a, b=1, c='hello'):
+ pass
+
+ argspec = tf_inspect.FullArgSpec(
+ args=['cls', 'a', 'b', 'c'],
+ varargs=None,
+ varkw=None,
+ defaults=(1, 'hello'),
+ kwonlyargs=[],
+ kwonlydefaults=None,
+ annotations={})
+
+ self.assertEqual(argspec, tf_inspect.getfullargspec(NewClass))
+
def testGetDoc(self):
self.assertEqual('Test Decorated Function With Defaults Docstring.',
tf_inspect.getdoc(test_decorated_function_with_defaults))