jeudi 21 mars 2019

Pass closure to FunctionType in function

I have a code like this:

class A():
def __init__(self, a):
    self.a = a
def outer_method(self):
   def inner_method():
       return self.a +1
   return inner_method()

I want to write a test for inner_method. For that, I am using a code like this:

def find_nested_func(parent, child_name):
    """ 
       Return the function named <child_name> that is defined inside
        a <parent> function
        Returns None if nonexistent
    """
    consts = parent.__code__.co_consts
    item = list(filter(lambda x:isinstance(x, CodeType) and x.co_name==child_name, consts ))[0]
    return FunctionType(item, globals())

Calling it with find_nested_func(A().outer_method, 'inner_method') but it fails when calling to 'FunctionType' because the function cannot be created since 'self.a' stops existing in the moment the function stops being an inner function. I know the construction FunctionType can recive as an argument a closure that could fix this problem , but I don't know how to use it. How can I pass it?

The error it gives is the next one:

    return FunctionType(item, globals())
TypeError: arg 5 (closure) must be tuple

Aucun commentaire:

Enregistrer un commentaire