2012-12-29 2 views
2

"unpredictable_words"문자열이 포함 된 파일이 있다고 가정 해 봅니다. 나는이 문자열을 읽고 다음과 같이 함수를 정의하고 싶습니다 :python - 어떻게 Idynamically 파일에서 문자열을 기반으로 이름을 가진 함수를 만들 수 있습니까?

def test_unpredictable_words(self): 
    do_important_stuff() 

내가이 함수는이 클래스의 인스턴스에서 호출 할 수 있도록 클래스 정의에이 기능을 주입하고 싶습니다.

어떻게하면됩니까?

나는이 대답을 약간 보았다. - https://stackoverflow.com/a/8160676/1701170 -하지만 나는 그것이 정확히 무엇을 원하고 있다고 생각하지 않는다. 또는 정확히 무엇이 일어나고 있는지 이해할 수 없다.

답변

4
Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
>>> def injected(self): 
...  print 'injected' 
... 
>>> class A(object): 
...  pass 
... 
>>> A.injected = injected 
>>> a = A() 
>>> a.injected() 
injected 
>>> def func2(self): 
...  print 'func2' 
... 
>>> setattr(A, 'injected2', func2) 
>>> a.injected2() 
func2 
>>> 
+1

나는 따라 가지 않습니다. 대답에는 문자열을 기반으로 동적으로 결정되는 함수 이름이 없습니다. 기능을 주입하는 것은 저에게 어려운 부분이 아닙니다. 문자열을 기반으로하는 명명 된 함수를 정의하는 방법을 알면 이해할 수없는 부분입니다. – jononomo

+1

나는 당신이 필요로하는 것을 성취하는데 필요한 모든 대답을 가지고 있다고 생각합니다. 새 메소드를 삽입하려는 클래스 'A'가 있습니다. 파일에서 메소드 이름을 추출하고, 필요한 코드로 모든 함수 (이름은 중요하지 않음)를 정의하고,'setattr (A, method_name, your_defined_function)'을 사용하여 새 메소드를 삽입하십시오. – warvariuc

+1

Python의 함수는 일류 시민입니다. 함수 이름은 중요하지 않으며 여러 변수에 동일한 함수를 지정할 수 있습니다. 따라서 "문자열을 기반으로하는 이름을 사용하여 함수를 정의하는 방법을 아는 것"은 나에게 의미가 없습니다. 함수를 정의한 다음 다른 이름으로 클래스에 삽입하십시오. 덕분에 – warvariuc

1

하나의 실제 이름으로 기능을 정의 할 필요는 없습니다. 함수는 일등급 엔티티입니다. 변수를 전달하고 변수에 할당 할 수 있습니다. 스택 트레이스 내에서 잘 표시하기 위해,

>>> def foo(x): 
... return x + 1 
... 
>>> name = 'unpredictable_words' 
>>> 
>>> globals()['test_' + name] = foo 
>>> 
>>> test_unpredictable_words(1) 
2 
>>> 
>>> def some_function(): 
... locals()['test_' + name] = foo 
... return test_unpredictable_words(1) 
... 
>>> some_function() 
2 
>>> 

때때로 당신은 여전히 ​​함수가 그 이름을 알고 싶어 : 최상위 레벨에서, 당신은 이름을 결합하는 또 다른 기능, locals() withing에, globals()를 사용합니다. 오류 메시지에 test_unpredictable_wordsfoo으로 표시됩니다. 이 이름은 foo.func_code.co_name에 저장되어 있으며 변경할 수 없으므로 수정하기 쉽지 않습니다.