我说我有两种方法first_method
和second_method
如下。
def first_method(some_arg):
"""
This is the method that calls the second_method
"""
return second_method(some_arg[1], some_arg[2])
def second_method(arg1, arg2):
"""
This method can only be called from the first_method
or it will raise an error.
"""
if (some condition):
#Execute the second_method
else:
raise SomeError("You are not authorized to call me!")
如何检查第一种方法调用第二种方法(根据什么条件)并根据该方法处理方法?
答案 0 :(得分:4)
为什么不在第一个方法中定义第二个方法,以便不直接调用它。
示例:
def first_method(some_arg):
"""
This is the method that calls the second_method
"""
def second_method(arg1, arg2):
"""
This method can only be called from the first_method
hence defined here
"""
#Execute the second_method
return second_method(some_arg[1], some_arg[2])
答案 1 :(得分:1)
您可以查看inspect module中的一些堆栈函数。
但是,你在做什么可能是一个坏主意。尝试强制执行此类操作并不值得。只记录第二种方法不应该被直接调用,给它一个带有前导下划线(_secret_second_method
或其他)的名称,然后如果有人直接调用它就是他们自己的问题。
或者,只是不要将它作为单独的方法并将代码放在first_method
中。如果除了从一个地方以外从未调用它,为什么还需要将它作为一个单独的函数?在这种情况下,它也可能是第一种方法的一部分。
答案 2 :(得分:1)
以下是关于如何获取调用者方法框架(在该框架中有很多信息)的示例,与Django没有特别关系:
import re, sys, thread
def s(string):
if isinstance(string, unicode):
t = str
else:
t = unicode
def subst_variable(mo):
name = mo.group(0)[2:-1]
frame = sys._current_frames()[thread.get_ident()].f_back.f_back.f_back
if name in frame.f_locals:
value = t(frame.f_locals[name])
elif name in frame.f_globals:
value = t(frame.f_globals[name])
else:
raise StandardError('Unknown variable %s' % name)
return value
return re.sub('(#\{[a-zA-Z_][a-zA-Z0-9]*\})', subst_variable, string)
first = 'a'
second = 'b'
print s(u'My name is #{first} #{second}')
基本上,您可以使用sys._current_frames()[thread.get_ident()]
获取帧链接列表的头部(每个调用者的帧),然后查找您想要的任何运行时信息。