我想在下面的代码中的任何地方调用以下代码MY_MACRO.
# MY_MACRO
frameinfo = getframeinfo(currentframe())
msg = 'We are on file ' + frameinfo.filename + ' and line ' + str(frameinfo.lineno)
# Assumes access to namespace and the variables in which `MY_MACRO` is called.
current_state = locals().items()
Run Code Online (Sandbox Code Playgroud)
以下是一些可以使用的代码MY_MACRO:
def some_function:
MY_MACRO
def some_other_function:
some_function()
MY_MACRO
class some_class:
def some_method:
MY_MACRO
Run Code Online (Sandbox Code Playgroud)
如果它有帮助:
MY_MACRO我需要它的地方的代码.拥有简短易用的东西会非常有帮助.locals().items()(见本的其他问题)这在Python中是否可行?什么是使这个工作最简单的方法?
请注意,宏假定访问调用它的作用域的整个命名空间(即仅将代码MY_MACRO放在函数中不起作用).另请注意,如果我放在MY_MACRO一个函数中,lineno会输出错误的行号.
Ned*_*der 13
你可以打电话的功能怎么样?此函数访问调用者的框架,而不是使用locals(),用于frame.f_locals获取调用者的命名空间.
def my_function():
frame = currentframe().f_back
msg = 'We are on file {0.f_code.co_filename} and line {0.f_lineno}'.format(frame)
current_state = frame.f_locals
print current_state['some_variable']
Run Code Online (Sandbox Code Playgroud)
然后就叫它:
def some_function:
my_function()
def some_other_function:
some_function()
my_function()
class some_class:
def some_method:
my_function()
Run Code Online (Sandbox Code Playgroud)
使用的exec就是令人难以接受的,但它应该在这里做的伎俩。例如,采用以下宏:
MY_MACRO = """
print foo
"""
Run Code Online (Sandbox Code Playgroud)
并使用以下代码运行它:
foo = "breaking the rules"
exec MY_MACRO in globals(),locals()
Run Code Online (Sandbox Code Playgroud)
始终小心使用exec,因为它可能会产生奇怪的副作用并为代码注入提供机会。