문제

기능이 주어졌습니다

def f():
    x, y = 1, 2 
    def get():
        print 'get'
    def post():
        print 'post'

내가 호출 할 수있는 방식으로 로컬 get () 및 post () 함수에 액세스 할 수있는 방법이 있습니까? 위에서 정의한 함수 f ()와 같은 기능을 찾고있는 함수를 찾고 있습니다.

>>> get, post = get_local_functions(f)
>>> get()
'get'

그렇게하는 지역 기능의 코드 개체에 액세스 할 수 있습니다.

import inspect
for c in f.func_code.co_consts:
    if inspect.iscode(c):
        print c.co_name, c

결과가 발생합니다

get <code object get at 0x26e78 ...>
post <code object post at 0x269f8 ...>

그러나 실제 호출 기능 개체를 얻는 방법을 알 수 없습니다. 그게 가능합니까?

당신의 도움을 주셔서 감사합니다,

할 것이다.

도움이 되었습니까?

해결책

당신은 그 일을 매우 가깝습니다 - 그냥 놓치고 new 기준 치수:

import inspect
import new

def f():
    x, y = 1, 2
    def get():
        print 'get'
    def post():
        print 'post'

for c in f.func_code.co_consts:
    if inspect.iscode(c):
        f = new.function(c, globals())
        print f # Here you have your function :].

그러나 왜 도대체 귀찮게합니까? 클래스를 사용하는 것이 더 쉽지 않습니까? 인스턴스화는 어쨌든 함수 호출처럼 보입니다.

다른 팁

파이썬의 다른 객체와 마찬가지로 기능을 반환 할 수 있습니다.

def f():
    x, y = 1, 2 
    def get():
        print 'get'
    def post():
        print 'post'
    return (get, post)


get, post = f()

도움이 되었기를 바랍니다!

그러나 get () 또는 post ()에서 'x'및 'y'변수를 사용하려면 목록으로 만들어야합니다.

다음과 같이하는 경우 :

def f():
    x = [1]
    def get():
        print 'get', x[0]
        x[0] -= 1
    def post():
        print 'post', x[0]
        x[0] += 1
    return (get, post)

get1, post1 = f()
get2, post2 = f()

get1 및 post1은 get2 및 post2와 다른 'x'목록을 참조합니다.

Exec를 사용하여 코드 객체를 실행할 수 있습니다. 예를 들어, 위와 같이 F를 정의했다면

exec(f.func_code.co_consts[3])

줄 것입니다

get

출력으로.

함수 f ()가 실행되기 전에 내부 함수 객체가 존재하지 않습니다. 당신이 그들을 얻으려면 그들을 직접 만들어야합니다. 함수의 범위에서 변수를 캡처하는 클로저 일 수 있으며 어쨌든 통역사의 구현 세부 사항으로 간주되어야 할 객체에서 파킹해야하기 때문에 사소한 일이 아닙니다.

반복이 적은 기능을 수집하려면 다음 접근 방식 중 하나를 권장합니다.

a) 함수를 클래스 정의에 넣고 해당 클래스에 대한 참조를 반환하십시오. 이름으로 액세스하는 관련 기능 모음은 수업처럼 끔찍하게 냄새가납니다.

b) 함수를 등록하는 방법이있는 DICT 서브 클래스를 만들고이를 데코레이터로 사용하십시오.

이에 대한 코드는 다음과 같습니다.

class FunctionCollector(dict):
    def register(self, func):
        self[func.__name__] = func

def f():
    funcs = FunctionCollector()
    @funcs.register
    def get():
        return 'get'
    @funcs.register
    def put():
        return 'put'
    return funcs

c) Locals ()에서 주위를 찌르고 검사를 사용하여 기능을 필터링합니다. (보통 좋은 생각이 아님)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top