diff options
19 files changed, 79 insertions, 59 deletions
diff --git a/tensorflow/contrib/gan/python/losses/python/tuple_losses_impl.py b/tensorflow/contrib/gan/python/losses/python/tuple_losses_impl.py index 00a83e5e55..221c70c38b 100644 --- a/tensorflow/contrib/gan/python/losses/python/tuple_losses_impl.py +++ b/tensorflow/contrib/gan/python/losses/python/tuple_losses_impl.py @@ -101,7 +101,7 @@ def _args_to_gan_model(loss_fn): """ # Match arguments in `loss_fn` to elements of `namedtuple`. # TODO(joelshor): Properly handle `varargs` and `keywords`. - argspec = tf_inspect.getfullargspec(loss_fn) + argspec = tf_inspect.getargspec(loss_fn) defaults = argspec.defaults or [] required_args = set(argspec.args[:-len(defaults)]) diff --git a/tensorflow/contrib/labeled_tensor/python/ops/_typecheck.py b/tensorflow/contrib/labeled_tensor/python/ops/_typecheck.py index 0e23039847..80fa17ec1f 100644 --- a/tensorflow/contrib/labeled_tensor/python/ops/_typecheck.py +++ b/tensorflow/contrib/labeled_tensor/python/ops/_typecheck.py @@ -230,7 +230,7 @@ def accepts(*types): def check_accepts(f): """Check the types.""" - spec = tf_inspect.getfullargspec(f) + spec = tf_inspect.getargspec(f) num_function_arguments = len(spec.args) if len(types) != num_function_arguments: diff --git a/tensorflow/contrib/layers/python/layers/rev_block_lib.py b/tensorflow/contrib/layers/python/layers/rev_block_lib.py index 55979cc391..06da32072f 100644 --- a/tensorflow/contrib/layers/python/layers/rev_block_lib.py +++ b/tensorflow/contrib/layers/python/layers/rev_block_lib.py @@ -576,8 +576,7 @@ def _recomputing_grad_fn(compute_fn, def _recompute_grad(fn, args, use_data_dep=_USE_DEFAULT, tupleize_grads=False): """See recompute_grad.""" - has_is_recompute_kwarg = ( - "is_recomputing" in tf_inspect.getfullargspec(fn).args) + has_is_recompute_kwarg = "is_recomputing" in tf_inspect.getargspec(fn).args for arg in args: if not isinstance(arg, framework_ops.Tensor): raise ValueError("All inputs to function must be Tensors") diff --git a/tensorflow/contrib/learn/python/learn/estimators/estimator.py b/tensorflow/contrib/learn/python/learn/estimators/estimator.py index b88923bca2..c1de42782e 100644 --- a/tensorflow/contrib/learn/python/learn/estimators/estimator.py +++ b/tensorflow/contrib/learn/python/learn/estimators/estimator.py @@ -199,11 +199,11 @@ def _model_fn_args(fn): if hasattr(fn, 'func') and hasattr(fn, 'keywords') and hasattr(fn, 'args'): # Handle functools.partial and similar objects. return tuple([ - arg for arg in tf_inspect.getfullargspec(fn.func).args[len(fn.args):] + arg for arg in tf_inspect.getargspec(fn.func).args[len(fn.args):] if arg not in set(fn.keywords.keys()) ]) # Handle function. - return tuple(tf_inspect.getfullargspec(fn).args) + return tuple(tf_inspect.getargspec(fn).args) def _get_replica_device_setter(config): diff --git a/tensorflow/contrib/learn/python/learn/estimators/head.py b/tensorflow/contrib/learn/python/learn/estimators/head.py index 63dd08316b..c6f79e00d5 100644 --- a/tensorflow/contrib/learn/python/learn/estimators/head.py +++ b/tensorflow/contrib/learn/python/learn/estimators/head.py @@ -1861,7 +1861,7 @@ def _get_arguments(func): _, func = tf_decorator.unwrap(func) if hasattr(func, "__code__"): # Regular function. - return tf_inspect.getfullargspec(func) + return tf_inspect.getargspec(func) elif hasattr(func, "func"): # Partial function. return _get_arguments(func.func) diff --git a/tensorflow/contrib/learn/python/learn/experiment_test.py b/tensorflow/contrib/learn/python/learn/experiment_test.py index 6926696fb6..fb16c94c29 100644 --- a/tensorflow/contrib/learn/python/learn/experiment_test.py +++ b/tensorflow/contrib/learn/python/learn/experiment_test.py @@ -126,7 +126,7 @@ class TestBaseEstimator(object): def _check_method_supports_args(method, kwargs): """Checks that the given method supports the given args.""" - supported_args = tuple(tf_inspect.getfullargspec(method).args) + supported_args = tuple(tf_inspect.getargspec(method).args) for kwarg in kwargs: if kwarg not in supported_args: raise ValueError( diff --git a/tensorflow/contrib/learn/python/learn/export_strategy.py b/tensorflow/contrib/learn/python/learn/export_strategy.py index 0d6e0cdc18..075cab536e 100644 --- a/tensorflow/contrib/learn/python/learn/export_strategy.py +++ b/tensorflow/contrib/learn/python/learn/export_strategy.py @@ -96,7 +96,7 @@ class ExportStrategy( """ # don't break existing export_fns that don't accept checkpoint_path and # eval_result - export_fn_args = tf_inspect.getfullargspec(self.export_fn).args + export_fn_args = tf_inspect.getargspec(self.export_fn).args kwargs = {} if 'checkpoint_path' in export_fn_args: kwargs['checkpoint_path'] = checkpoint_path diff --git a/tensorflow/contrib/learn/python/learn/metric_spec.py b/tensorflow/contrib/learn/python/learn/metric_spec.py index 604d6d46b4..97220365d5 100644 --- a/tensorflow/contrib/learn/python/learn/metric_spec.py +++ b/tensorflow/contrib/learn/python/learn/metric_spec.py @@ -51,7 +51,7 @@ def _args(fn): return tuple( [arg for arg in _args(fn.func) if arg not in set(fn.keywords.keys())]) # Handle function. - return tuple(tf_inspect.getfullargspec(fn).args) + return tuple(tf_inspect.getargspec(fn).args) _CANONICAL_LABELS_ARG = 'labels' diff --git a/tensorflow/contrib/learn/python/learn/monitors.py b/tensorflow/contrib/learn/python/learn/monitors.py index 5f61e0264f..3d691d4340 100644 --- a/tensorflow/contrib/learn/python/learn/monitors.py +++ b/tensorflow/contrib/learn/python/learn/monitors.py @@ -1303,7 +1303,7 @@ class RunHookAdapterForMonitors(session_run_hook.SessionRunHook): def end(self, session): self._last_step = None for m in self._monitors: - if "session" in tf_inspect.getfullargspec(m.end).args: + if "session" in tf_inspect.getargspec(m.end).args: m.end(session=session) else: m.end() diff --git a/tensorflow/contrib/tpu/python/tpu/tpu_function.py b/tensorflow/contrib/tpu/python/tpu/tpu_function.py index 9c4bd1c4d1..0c7a38dbbb 100644 --- a/tensorflow/contrib/tpu/python/tpu/tpu_function.py +++ b/tensorflow/contrib/tpu/python/tpu/tpu_function.py @@ -80,7 +80,7 @@ def check_function_argument_count(func, input_arity, infeed_queue): number_of_arguments_needed = input_arity if infeed_queue is not None: number_of_arguments_needed += infeed_queue.number_of_tuple_elements - arg_spec = tf_inspect.getfullargspec(func) + arg_spec = tf_inspect.getargspec(func) number_of_args = len(arg_spec.args) if arg_spec.defaults is None: number_of_defaults = 0 diff --git a/tensorflow/python/framework/errors_impl.py b/tensorflow/python/framework/errors_impl.py index c373e75a74..5af71f2cfb 100644 --- a/tensorflow/python/framework/errors_impl.py +++ b/tensorflow/python/framework/errors_impl.py @@ -55,7 +55,7 @@ class OpError(Exception): def __reduce__(self): # Allow the subclasses to accept less arguments in their __init__. - init_argspec = tf_inspect.getfullargspec(self.__class__.__init__) + init_argspec = tf_inspect.getargspec(self.__class__.__init__) args = tuple(getattr(self, arg) for arg in init_argspec.args[1:]) return self.__class__, args diff --git a/tensorflow/python/framework/function.py b/tensorflow/python/framework/function.py index 3db6f683c9..225208944e 100644 --- a/tensorflow/python/framework/function.py +++ b/tensorflow/python/framework/function.py @@ -132,9 +132,9 @@ class Defun(object): raise ValueError("func %s must be callable" % func) # Func should not use kwargs and defaults. - argspec = tf_inspect.getfullargspec(func) - if argspec.varkw or argspec.defaults: - raise ValueError("Functions with argument defaults or varkw " + argspec = tf_inspect.getargspec(func) + if argspec.keywords or argspec.defaults: + raise ValueError("Functions with argument defaults or keywords " "arguments are not supported.") # Computes how many arguments 'func' has. diff --git a/tensorflow/python/keras/backend_test.py b/tensorflow/python/keras/backend_test.py index 31191d0d35..ab71589940 100644 --- a/tensorflow/python/keras/backend_test.py +++ b/tensorflow/python/keras/backend_test.py @@ -452,7 +452,7 @@ class BackendLinearAlgebraTest(test.TestCase): compare_single_input_op_to_numpy(keras_op, np_op, input_shape=(4, 7, 5), keras_kwargs={'axis': -1}, np_kwargs={'axis': -1}) - if 'keepdims' in tf_inspect.getfullargspec(keras_op).args: + if 'keepdims' in tf_inspect.getargspec(keras_op).args: compare_single_input_op_to_numpy(keras_op, np_op, input_shape=(4, 7, 5), keras_kwargs={'axis': 1, diff --git a/tensorflow/python/keras/testing_utils.py b/tensorflow/python/keras/testing_utils.py index 1afaba5653..501b50ba5f 100644 --- a/tensorflow/python/keras/testing_utils.py +++ b/tensorflow/python/keras/testing_utils.py @@ -102,7 +102,7 @@ def layer_test(layer_cls, kwargs=None, input_shape=None, input_dtype=None, layer.set_weights(weights) # test and instantiation from weights - if 'weights' in tf_inspect.getfullargspec(layer_cls.__init__): + if 'weights' in tf_inspect.getargspec(layer_cls.__init__): kwargs['weights'] = weights layer = layer_cls(**kwargs) diff --git a/tensorflow/python/kernel_tests/variable_scope_test.py b/tensorflow/python/kernel_tests/variable_scope_test.py index 1d0b72b17a..401e1ae102 100644 --- a/tensorflow/python/kernel_tests/variable_scope_test.py +++ b/tensorflow/python/kernel_tests/variable_scope_test.py @@ -998,8 +998,8 @@ class VariableScopeTest(test.TestCase): def testSignatureGetVarVsGetLocalVar(self): """get_{local,}variable() must take the same list of args.""" - arg_names = tf_inspect.getfullargspec(variable_scope.get_variable)[0] - local_arg_names = tf_inspect.getfullargspec( + arg_names = tf_inspect.getargspec(variable_scope.get_variable)[0] + local_arg_names = tf_inspect.getargspec( variable_scope.get_local_variable)[0] self.assertEqual(arg_names, local_arg_names) diff --git a/tensorflow/python/ops/variable_scope.py b/tensorflow/python/ops/variable_scope.py index 3cc1eb916d..a43676cd70 100644 --- a/tensorflow/python/ops/variable_scope.py +++ b/tensorflow/python/ops/variable_scope.py @@ -892,14 +892,14 @@ class _VariableStore(object): if shape and shape.is_fully_defined(): init_val = lambda: initializer( # pylint: disable=g-long-lambda shape.as_list(), dtype=dtype, partition_info=partition_info) - elif not tf_inspect.getfullargspec(initializer).args: + elif not tf_inspect.getargspec(initializer).args: init_val = initializer else: raise ValueError("You can only pass an initializer function that " "expects no arguments to its callable when the " "shape is not fully defined. The given initializer " "function expects the following args %s" % - tf_inspect.getfullargspec(initializer).args) + tf_inspect.getargspec(initializer).args) variable_dtype = dtype.base_dtype # Create the variable. diff --git a/tensorflow/python/util/tf_contextlib_test.py b/tensorflow/python/util/tf_contextlib_test.py index 1e921b5ea3..4a5bf388a6 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.getfullargspec(test_params_and_defaults) + argspec = tf_inspect.getargspec(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 234850ac3f..3cd6c515b9 100644 --- a/tensorflow/python/util/tf_inspect.py +++ b/tensorflow/python/util/tf_inspect.py @@ -36,6 +36,53 @@ else: 'annotations' ]) +if hasattr(_inspect, 'getfullargspec'): + _getfullargspec = _inspect.getfullargspec # pylint: disable=invalid-name + + def _getargspec(target): + """A python3 version of getargspec. + + Calls `getfullargspec` and assigns args, varargs, + varkw, and defaults to a python 2/3 compatible `ArgSpec`. + + The parameter name 'varkw' is changed to 'keywords' to fit the + `ArgSpec` struct. + + Args: + target: the target object to inspect. + Returns: + An ArgSpec with args, varargs, keywords, and defaults parameters + from FullArgSpec. + """ + fullargspecs = getfullargspec(target) + argspecs = ArgSpec( + args=fullargspecs.args, + varargs=fullargspecs.varargs, + keywords=fullargspecs.varkw, + defaults=fullargspecs.defaults) + return argspecs +else: + _getargspec = _inspect.getargspec + + def _getfullargspec(target): + """A python2 version of getfullargspec. + + Args: + target: the target object to inspect. + Returns: + A FullArgSpec with empty kwonlyargs, kwonlydefaults and annotations. + """ + argspecs = getargspec(target) + fullargspecs = FullArgSpec( + args=argspecs.args, + varargs=argspecs.varargs, + varkw=argspecs.keywords, + defaults=argspecs.defaults, + kwonlyargs=[], + kwonlydefaults=None, + annotations={}) + return fullargspecs + def currentframe(): """TFDecorator-aware replacement for inspect.currentframe.""" @@ -45,10 +92,8 @@ def currentframe(): def getargspec(obj): """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. + Note: `getfullargspec` is recommended as the python 2/3 compatible + replacement for this function. Args: obj: A function, partial function, or callable object, possibly @@ -56,8 +101,8 @@ def getargspec(obj): Returns: The `ArgSpec` that describes the signature of the outermost decorator that - changes the callable's signature. If the callable is not decorated, - `inspect.getargspec()` will be called directly on the object. + changes the callable's signature, or the `ArgSpec` that describes + the object if not decorated. Raises: ValueError: When callable's signature can not be expressed with @@ -77,24 +122,24 @@ def getargspec(obj): try: # Python3 will handle most callables here (not partial). - return _inspect.getargspec(target) + return _getargspec(target) except TypeError: pass if isinstance(target, type): try: - return _inspect.getargspec(target.__init__) + return _getargspec(target.__init__) except TypeError: pass try: - return _inspect.getargspec(target.__new__) + return _getargspec(target.__new__) except TypeError: pass # The `type(target)` ensures that if a class is received we don't return # the signature of it's __call__ method. - return _inspect.getargspec(type(target).__call__) + return _getargspec(type(target).__call__) def _get_argspec_for_partial(obj): @@ -177,30 +222,6 @@ def _get_argspec_for_partial(obj): return ArgSpec(args, varargs, keywords, tuple(all_defaults[first_default:])) -if hasattr(_inspect, 'getfullargspec'): - _getfullargspec = _inspect.getfullargspec -else: - - def _getfullargspec(target): - """A python2 version of getfullargspec. - - Args: - target: the target object to inspect. - Returns: - A FullArgSpec with empty kwonlyargs, kwonlydefaults and annotations. - """ - argspecs = getargspec(target) - fullargspecs = FullArgSpec( - args=argspecs.args, - varargs=argspecs.varargs, - varkw=argspecs.keywords, - defaults=argspecs.defaults, - kwonlyargs=[], - kwonlydefaults=None, - annotations={}) - return fullargspecs - - def getfullargspec(obj): """TFDecorator-aware replacement for `inspect.getfullargspec`. diff --git a/tensorflow/tools/api/lib/python_object_to_proto_visitor.py b/tensorflow/tools/api/lib/python_object_to_proto_visitor.py index a8e69fda4f..3a48cf683c 100644 --- a/tensorflow/tools/api/lib/python_object_to_proto_visitor.py +++ b/tensorflow/tools/api/lib/python_object_to_proto_visitor.py @@ -47,9 +47,9 @@ def _SanitizedArgSpec(obj): string, a string representation of the argspec. """ output_string = '' - unsanitized_arg_spec = tf_inspect.getfullargspec(obj) + unsanitized_arg_spec = tf_inspect.getargspec(obj) - for clean_attr in ('args', 'varargs', 'varkw'): + for clean_attr in ('args', 'varargs', 'keywords'): output_string += '%s=%s, ' % (clean_attr, getattr(unsanitized_arg_spec, clean_attr)) |