이 제대로이 100 %를 수행하는 것은 거의 불가능합니다,하지만 당신은 다음과 같은 시도 줄 수 :
import inspect
import parser
# this flatten function is by mike c fletcher
def flatten(l, ltypes=(list, tuple)):
ltype = type(l)
l = list(l)
i = 0
while i < len(l):
while isinstance(l[i], ltypes):
if not l[i]:
l.pop(i)
i -= 1
break
else:
l[i:i + 1] = l[i]
i += 1
return ltype(l)
# function we're interested in
def a():
current_func = eval(inspect.stack()[0][3])
last_frame = inspect.stack()[1]
calling_code = last_frame[4][0]
syntax_tree = parser.expr(calling_code)
syntax_tree_tuple = parser.st2tuple(syntax_tree)
flat_syntax_tree_tuple = flatten(syntax_tree_tuple)
list_of_strings = filter(lambda s: type(s)==str,flat_syntax_tree_tuple)
list_of_valid_strings = []
for string in list_of_strings:
try:
st = parser.expr(string)
list_of_valid_strings.append(string)
except:
pass
list_of_candidates = filter(lambda s: eval(s)==current_func, list_of_valid_strings)
print list_of_candidates
# other function
def c():
pass
a()
b=a
a(),b(),c()
a(),c()
c(),b()
이 인쇄됩니다 : 그것은 꽤 추한 복잡
['a']
['a', 'b']
['a', 'b']
['a']
['b']
,하지만 작동 할 수 있습니다 네가 필요로하는 것을 위해. 이 함수를 호출 한 행에 사용 된 모든 변수를 찾아 현재 함수와 비교하여 작동합니다.
출처
2012-07-18 18:27:59
Tar
나는 이것이 가능하다고 생각합니다. 당신이 이것을하고 싶어하는 어떤 특별한 이유? – mgilson
보통 사람들이 이런 식으로 행동하는 법을 물어 보면 정말 무서운 일을하고 있습니다. 이것이 어떤 목적을 위해 사용될 것인지 명확히 할 수 있습니까? – cdhowie
파트의 __name__을 변경할 수는 있지만이를 수행하려는 이유를 이해할 수 없습니다. 또한 데코레이터 문서를 살펴보십시오. – sean