【发布时间】:2019-10-26 01:29:23
【问题描述】:
我正在用 Python 编写一个框架。当用户声明一个函数时,他们会这样做:
def foo(row, fetch=stuff, query=otherStuff)
def bar(row, query=stuff)
def bar2(row)
当后端看到 query= value 时,它会根据 value 执行带有查询参数的函数。这样,函数就可以访问后端在其范围内完成的某些操作的结果。
目前,我每次都通过检查 query、fetch 和其他项目是否为 None 来构建我的论点,并使用一组与用户要求的完全匹配的 args 启动它。否则我得到“得到一个意外的关键字参数”错误。这是后端的代码:
#fetch and query is something computed by the backend
if fetch= None and query==None:
userfunction(row)
elif fetch==None:
userunction (row, query=query)
elif query == None:
userfunction (row, fetch=fetch)
else:
userfunction (row,fetch=fetch,query=query)
这不好;对于后端提供的每一项附加“服务”,我需要将所有组合与之前的组合一起编写。
我想主要采用该函数并手动添加一个命名参数,然后再执行它,删除所有进行这些检查的不必要代码。然后用户就会使用它真正想要的东西。
我不希望用户必须通过添加不需要的东西来修改函数(我也不希望他们每次都指定kwarg)。
因此,如果可行,我想要一个示例,一个函数 addNamedVar(name, function) 将变量 name 添加到函数 function。
我想这样做是因为用户函数被调用了很多次,这意味着它会触发我,例如,创建函数的命名 var 的字典(使用检查),然后使用 @ 987654327@。我真的很想只修改一次函数以避免任何类型的开销。
【问题讨论】:
-
你能解释一下为什么是-1吗?
-
经过一番搜索,我认为使用 ast 模块可能是可行的。修改 functionDef 节点。我不太确定。
标签: python-3.x arguments abstract-syntax-tree python-internals