【问题标题】:Dynamic generation of Python function with given parameter names具有给定参数名称的 Python 函数的动态生成
【发布时间】:2018-07-12 07:33:33
【问题描述】:

我想在我的 Python3 代码中创建函数,利用运行时提供的数据。我一直坚持如何编写一个函数

def foo(varname1, varname2):
    return varname1 + varname2

其中给出参数名称的字符串varname1varname2 被指定为某些构造函数的参数,例如:

def makeNewFooFunc(varname1, varname2):
    # do magic
    return foo

fooFunc = makeNewFooFunc('first', 'second')

print(fooFunc(first=1, second=2))
# should return 3

#do magic 步骤是什么?这是eval 的工作,还是有其他选择?

【问题讨论】:

  • 为什么参数名称很重要?在我看来,您可以只使用**kwargs,而无需使用该特定签名“生成函数”。
  • @deceze 在处理询问函数并使用字典传递参数的外部代码时,重要的是参数名称,而不是它们的位置。
  • 外部代码正在检查函数签名并相应地改变其行为?
  • @deceze 不确定。我正在使用 Flask-Restful,需要资源类具有 get、post 等方法,其参数名称与资源 url 中的变量名称匹配。
  • 所以它可能只是在做your_function(**params),这意味着def your_function(**kwargs) 应该可以正常工作。另外,为什么你不能简单地手动编写这些函数签名呢?大概这些函数中的每一个都是独一无二的,那么为什么需要生成它们呢?

标签: python python-3.x metaprogramming


【解决方案1】:

您不需要编写这样的函数。 只需使用 **kwargs

def foo_func(**kwargs):
    return sum(kwargs.values())

foo_func(any_name=1, any_name_2=2)

但如果你还需要做你想做的事,你可以试试

def make_new_func(var_name_1, var_name_2):
    def foo(**kwargs):
        # make sure in kwargs only expected parameters
        assert set(kwargs) == {var_name_1,  var_name_2}
        return kwargs[var_name_1] + kwargs[var_name_2]
    return foo

foo_func = make_new_func('a', 'b')

foo_func(a=1, b=2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2020-08-21
    • 2014-11-22
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多