Base TFDecorator class and utility functions for working with decorators.
Compat aliases for migration
See Migration guide for more details.
There are two ways to create decorators that TensorFlow can introspect into. This is important for documentation generation purposes, so that function signatures aren't obscured by the (*args, **kwds) signature that decorators often provide.
tf_decorator.make_decoratoron your wrapper function. If your decorator is stateless, or can capture all of the variables it needs to work with through lexical closure, this is the simplest option. Create your wrapper function as usual, but instead of returning it, return
tf_decorator.make_decorator(target, your_wrapper). This will attach some decorator introspection metadata onto your wrapper and return it.
def print_hello_before_calling(target): def wrapper(*args, *kwargs): print('hello') return target(args, **kwargs) return tf_decorator.make_decorator(target, wrapper)
__call__method to do your work before calling into your target. You can retrieve the target via
super(MyDecoratorClass, self).decorated_target, and call it with whatever parameters it needs.
class CallCounter(tf_decorator.TFDecorator): def init(self, target): super(CallCounter, self).init('count_calls', target) self.call_count = 0
def call(self, *args, *kwargs): self.call_count += 1 return super(CallCounter, self).decorated_target(args, **kwargs)
def count_calls(target): return CallCounter(target)
tf_stack module: Functions used to extract and analyze stacks. Faster than Python libs.
class TFDecorator: Base class for all TensorFlow decorators.
make_decorator(...): Make a decorator from a wrapper and a target.
rewrap(...): Injects a new target into a function built by make_decorator.
unwrap(...): Unwraps an object into a list of TFDecorators and a final target.
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.