【问题标题】:In Python, is it possible to accept a function call template as a parameter?在 Python 中,是否可以接受函数调用模板作为参数?
【发布时间】:2019-06-26 18:38:13
【问题描述】:

基于 jsbueno 的出色回答:Aspect oriented programming (AOP) in Python,作为改进 Python 中面向切面编程语法的一部分,我想知道是否可以在 Python 中接受函数模板作为带有任何修饰的参数。

例如,能够调用 foo(bar(5))bar 未定义,并让 foo 接收表示表达式 bar(5) 的对象;而不是 bar 未定义的错误。 (然后,这将用作输入来构造一条规则,以匹配传入的网络消息,指示另一个节点已运行函数 bar,参数为 5。)

有没有比将模板作为字符串传递并使用ast 解析它更好的方法?

【问题讨论】:

  • 你想达到什么目的?当 bar 未定义时,函数 foo() 会做什么?
  • 不确定这是否是您在不了解更多上下文的情况下要查找的内容,但您不能只接受 bar 作为封闭函数的参数,然后传入您想要的任何函数有用吗?
  • 这对我来说听起来是个坏主意。使用这样的语法,您必须始终知道哪些函数实际存在(如foo),哪些是伪函数(如bar)。如果您稍后定义 bar 方法,那么您的旧代码可能突然停止工作 - 或者至少它会变得模棱两可。现在可能看起来很方便,但当你真正必须使用它时......
  • 我不介意是否有一些注释可应用于语法以表明这一点(但理想情况下不仅仅是将其设为字符串)

标签: python python-3.x metaprogramming


【解决方案1】:

我不确定,您在寻找什么,也许这会有所帮助:

def decorator(f):
    def wrapper(*args, **kwargs):
        print("f in wraper with: {}".format(f.__defaults__))
        return f(*args, **kwargs)
    return wrapper

funcs = {}
fdefaults = [1, 2, 3]
code = """def myfunc(x={}): return print("f returning:", *x)""".format(fdefaults)

exec(code, {}, funcs)
myfunc = decorator(funcs["myfunc"])
myfunc()

输出: f 在包装器中: ([1, 2, 3],) f 返回:1 2 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2011-04-30
    • 2011-04-15
    • 1970-01-01
    • 2013-05-11
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多