def testIsBuiltin(self): self.assertEqual(tf_inspect.isbuiltin(TestDecoratedClass), inspect.isbuiltin(TestDecoratedClass)) self.assertEqual(tf_inspect.isbuiltin(test_decorated_function), inspect.isbuiltin(test_decorated_function)) self.assertEqual(tf_inspect.isbuiltin(test_undecorated_function), inspect.isbuiltin(test_undecorated_function)) self.assertEqual(tf_inspect.isbuiltin(range), inspect.isbuiltin(range)) self.assertEqual(tf_inspect.isbuiltin(max), inspect.isbuiltin(max))
def testIsBuiltin(self): self.assertEqual( tf_inspect.isbuiltin(TestDecoratedClass), inspect.isbuiltin(TestDecoratedClass)) self.assertEqual( tf_inspect.isbuiltin(test_decorated_function), inspect.isbuiltin(test_decorated_function)) self.assertEqual( tf_inspect.isbuiltin(test_undecorated_function), inspect.isbuiltin(test_undecorated_function)) self.assertEqual(tf_inspect.isbuiltin(range), inspect.isbuiltin(range)) self.assertEqual(tf_inspect.isbuiltin(max), inspect.isbuiltin(max))
def isbuiltin(f): """Returns True if the argument is a built-in function.""" if f in SPECIAL_BUILTINS.values(): return True if isinstance(f, types.BuiltinFunctionType): return True if tf_inspect.isbuiltin(f): return True return False
def dynamic_builtin(f, *args, **kwargs): """Converts a builtin function call inline.""" if not tf_inspect.isbuiltin(f): return f(*args, **kwargs) if f is len: return dynamic_len(*args, **kwargs) raise NotImplementedError('The "%s" builtin is not yet supported.' % f)
def isbuiltin(f): """Returns True if the argument is a built-in function.""" if f in six.moves.builtins.__dict__.values(): return True if isinstance(f, types.BuiltinFunctionType): return True if tf_inspect.isbuiltin(f): return True return False
def isbuiltin(f): # Note these return false for isinstance(f, types.BuiltinFunctionType) so we # need to specifically check for them. if f in (range, int, float): return True if isinstance(f, types.BuiltinFunctionType): return True if tf_inspect.isbuiltin(f): return True return False
def isbuiltin(f): """Returns True if the argument is a built-in function.""" # Note these return false for isinstance(f, types.BuiltinFunctionType) so we # need to specifically check for them. if f in (range, int, float): return True if six.PY2: if f in (xrange, ): return True if isinstance(f, types.BuiltinFunctionType): return True if tf_inspect.isbuiltin(f): return True return False
def isbuiltin(f): """Returns True if the argument is a built-in function.""" # Note these return false for isinstance(f, types.BuiltinFunctionType) so we # need to specifically check for them. if f in (range, int, float): return True if six.PY2: if f in (xrange,): return True if isinstance(f, types.BuiltinFunctionType): return True if tf_inspect.isbuiltin(f): return True return False
def dynamic_builtin(f, *args, **kwargs): """Converts a builtin function call inline.""" # Some built-ins may be objects. if not tf_inspect.isbuiltin(f) and f not in (range,): return f(*args, **kwargs) if f is len: return dynamic_len(*args, **kwargs) if six.PY2 and f is xrange: return dynamic_range(*args, **kwargs) if f is range: return dynamic_range(*args, **kwargs) raise NotImplementedError( 'The "%s" builtin is not yet supported.' % f.__name__)
def dynamic_builtin(f, *args, **kwargs): """Converts a builtin function call inline.""" # Some built-ins may be objects. if not tf_inspect.isbuiltin(f) and f not in (range, ): return f(*args, **kwargs) if f is len: return dynamic_len(*args, **kwargs) if six.PY2 and f is xrange: return dynamic_range(*args, **kwargs) if f is range: return dynamic_range(*args, **kwargs) raise NotImplementedError('The "%s" builtin is not yet supported.' % f.__name__)
def converted_call(f, recursive, verbose, arg_types, *args, **kwargs): """Compiles a function call inline.""" # TODO(mdan): This needs cleanup. # In particular, we may want to avoid renaming functions altogether. if conversion.is_whitelisted_for_graph(f): return f(*args, **kwargs) unknown_arg_value = object() # Sentinel for arguments of unknown value if tf_inspect.isbuiltin(f): return builtins.dynamic_builtin(f, *args, **kwargs) if tf_inspect.isfunction(f) or tf_inspect.ismethod(f): # Regular functions target_entity = f arg_map_target = f effective_args = args f_class = inspect_utils.getmethodclass(f) if f_class is not None: partial_types = (f_class,) else: partial_types = () elif tf_inspect.isclass(f): # Constructors target_entity = f arg_map_target = f.__init__ effective_args = (unknown_arg_value,) + args partial_types = () elif hasattr(f, '__call__') and hasattr(f, '__class__'): # Callable objects target_entity = f.__call__ arg_map_target = f.__call__ effective_args = (f,) + args partial_types = (f.__class__,) else: NotImplementedError('unknown callable type "%s"' % type(f)) arg_values = tf_inspect.getcallargs(arg_map_target, *args, **kwargs) for name, arg in arg_values.items(): if arg is unknown_arg_value: continue arg_class = arg.__class__ # If arg_value_hints specifies any name, use that instead. if name not in arg_types: arg_types[name] = (arg_class.__name__, arg_class) # When called from within a decorator, this is the only indication that # the function is a method - it appears that the decorator is applied # before the method is bound. if not partial_types: if 'self' in arg_values: if tf_inspect.isclass(arg_values['self'].__class__): partial_types = (arg_values['self'].__class__,) elif 'cls' in arg_values: if tf_inspect.isclass(arg_values['cls']): partial_types = (arg_values['cls'],) converted_f = to_graph( target_entity, recursive=recursive, verbose=verbose, arg_values=arg_values, arg_types=arg_types, partial_types=partial_types) return converted_f(*effective_args, **kwargs)
def converted_call(f, recursive, verbose, arg_types, *args, **kwargs): """Compiles a function call inline.""" # TODO(mdan): This needs cleanup. # In particular, we may want to avoid renaming functions altogether. if conversion.is_whitelisted_for_graph(f): return f(*args, **kwargs) unknown_arg_value = object() # Sentinel for arguments of unknown value if tf_inspect.isbuiltin(f): return builtins.dynamic_builtin(f, *args, **kwargs) if tf_inspect.isfunction(f) or tf_inspect.ismethod(f): # Regular functions target_entity = f arg_map_target = f effective_args = args f_class = inspect_utils.getmethodclass(f) if f_class is not None: partial_types = (f_class, ) else: partial_types = () elif tf_inspect.isclass(f): # Constructors target_entity = f arg_map_target = f.__init__ effective_args = (unknown_arg_value, ) + args partial_types = () elif hasattr(f, '__call__') and hasattr(f, '__class__'): # Callable objects target_entity = f.__call__ arg_map_target = f.__call__ effective_args = (f, ) + args partial_types = (f.__class__, ) else: NotImplementedError('unknown callable type "%s"' % type(f)) arg_values = tf_inspect.getcallargs(arg_map_target, *args, **kwargs) for name, arg in arg_values.items(): if arg is unknown_arg_value: continue arg_class = arg.__class__ # If arg_value_hints specifies any name, use that instead. if name not in arg_types: arg_types[name] = (arg_class.__name__, arg_class) # When called from within a decorator, this is the only indication that # the function is a method - it appears that the decorator is applied # before the method is bound. if not partial_types: if 'self' in arg_values: if tf_inspect.isclass(arg_values['self'].__class__): partial_types = (arg_values['self'].__class__, ) elif 'cls' in arg_values: if tf_inspect.isclass(arg_values['cls']): partial_types = (arg_values['cls'], ) converted_f = to_graph(target_entity, recursive=recursive, verbose=verbose, arg_values=arg_values, arg_types=arg_types, partial_types=partial_types) return converted_f(*effective_args, **kwargs)