2016-11-09 2 views
0

.func_code과 같은 내부 객체를 통해 코드 객체를 가져 오면 어떤 방법으로 을 호출합니까?이 코드는 무엇입니까? 단순히 작동하지 않습니다 전화 :Python에서 코드 객체를 호출하는 방법

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'code' object is not callable 
이 유용하게 사용할 수 있습니다

에서

def f(): pass 

f.func_code() 

결과는 단위 테스트에 중첩 된 함수 같은 경우 :

def f(): 
    def g(): 
    return 3 
    f.x = g 
    return g() + 1 

f.func_code.co_consts[1] 

결과를

<code object g at 0x7f123991b930, file "<stdin>", line 2> 

물론이 pi 코드의 ece는 컨텍스트 등이 필요하지만 여기는 내 질문이 아닙니다.

+1

'평가'또는 '실행'할 수 있습니다. – vaultah

+0

새로운 함수를 만들고 그것에'func_code '를 할당 할 수 있습니다. 이런 일을하는 [this answer] (http://stackoverflow.com/a/3454053/355230)의'add_self()'함수를 보라. – martineau

+0

@vaultah 그게 내게 맞는 해결책이야! 당신은 그것을 A에 넣으려고하니,이 Q를 제대로 닫으려면 받아 들일 수 있습니까? – Alfe

답변

0

eval() 또는 exec 수 있습니다. 그들은 자유 변수가있는 경우

(E. g. 외부 함수 중첩 함수 이전에 정의 된 로컬 변수가 중첩 함수의 코드)이 (eval 또는 exec이 경우에는 TypeError 인상) 바로 가능하지 않다.

또한 코드에 인수를 전달하는 것이 직접 가능하지 않습니다.

하지만 주어진 코드에 대한 랩핑 기능을 즉석에서 만들 수 있습니다. 이 함수는 일반적으로 (f(…)을 사용하여) 호출 할 수 있으며 일반적인 방법으로 인수를 전달합니다. 이 작업은 types.FunctionType을 사용하여 수행됩니다. 무료 변수에 대한 참조를 얻으려면 Python이 예상하는대로 올바른 데이터 형식을 얻기 위해 트릭을 사용해야합니다. 아래 코드를 참조하십시오 :

def f(v1=1): 
    v2 = 2 
    def g(v3=4): 
    return v1 + v2 + v3 + 8 
    return g() + 16 

def freeVar(val): 
    def nested(): 
    return val 
    return nested.__closure__[0] 

def nested(outer, innerName, **freeVars): 
    if isinstance(outer, (types.FunctionType, types.MethodType)): 
    outer = outer.func_code 
    for const in outer.co_consts: 
    if isinstance(const, types.CodeType) and const.co_name == innerName: 
     return types.FunctionType(const, globals(), None, None, tuple(
      freeVar(freeVars[name]) for name in const.co_freevars)) 

nestedG = nested(f, 'g', v1=1, v2=2) 
print nestedG(4) # will print 15 
관련 문제