将宏添加到Python

Ame*_*ina 25 python macropy

我想在下面的代码中的任何地方调用以下代码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)

如果它有帮助:

  1. 我想拥有这种能力的原因之一是因为我想避免重复MY_MACRO我需要它的地方的代码.拥有简短易用的东西会非常有帮助.
  2. 另一个原因是因为我希望嵌入IPython的外壳wihthin宏观和我想有机会获得在所有变量locals().items()(见本的其他问题)

这在Python中是否可行?什么是使这个工作最简单的方法?

注意,宏假定访问调用它的作用域的整个命名空间(即仅将代码MY_MACRO放在函数中不起作用).另请注意,如果我放在MY_MACRO一个函数中,lineno会输出错误的行号.

Li *_*oyi 25

MacroPy是我的一个项目,它为Python提供语法宏.该项目只有3周的时间,但如果你看一下这个链接,你会发现我们有很酷的演示集合,你可以使用它实现你想要的功能.

另一方面,python有一些非常惊人的内省功能,所以我怀疑你可能能够完成纯粹使用该功能的你想要的东西.

  • MacroPy仍然受支持吗?它看起来很棒,正是我需要实现依赖性跟踪 - 但它似乎不适用于Python 2.7.3,或者安装Python 3.4 ... (4认同)

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)


Dan*_*Dan 5

使用的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,因为它可能会产生奇怪的副作用并为代码注入提供机会。