Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何动态创建非变量函数(无eval或类似)? 概述_Python_Arguments - Fatal编程技术网

Python 如何动态创建非变量函数(无eval或类似)? 概述

Python 如何动态创建非变量函数(无eval或类似)? 概述,python,arguments,Python,Arguments,在运行时的某个时刻,我想创建一个函数,该函数精确地接受给定数量的参数(仅在运行时已知)。这里的确切意思是,这一定不是一个可变函数。有没有办法不借助eval或类似的方法将字符串解释为代码就可以做到这一点 我的问题(略有减少) 我想创建一个函数,该函数接受它的参数,并将它们作为iterable传递给另一个函数。通常,我可以这样做: my_function = lambda *args: other_function(args) function_maker(2, other_function)(a

在运行时的某个时刻,我想创建一个函数,该函数精确地接受给定数量的参数(仅在运行时已知)。这里的确切意思是,这一定不是一个可变函数。有没有办法不借助
eval
或类似的方法将字符串解释为代码就可以做到这一点

我的问题(略有减少) 我想创建一个函数,该函数接受它的参数,并将它们作为iterable传递给另一个函数。通常,我可以这样做:

my_function = lambda *args: other_function(args)
function_maker(2, other_function)(a, b)
不幸的是,
my_函数
将被一些无法正确处理可变函数的例程调用。但是,
my_函数
将始终使用相同数量的参数调用
n_参数
。因此,如果我知道
n_args
为3,我可以使用:

my_function = lambda a,b,c: other_function((a,b,c))
问题是我只在运行时知道
n_args
,就在创建
my_函数之前。因此,我需要概括以上内容

到目前为止我发现了什么
  • 我使用
    eval
    (或
    exec
    或类似工具)实现了我想要的:

    这样做的缺点是我必须使用
    eval
    。如果您愿意,我的问题是如何在不使用
    eval
    或获取可变函数的情况下创建与上述内容等效的内容

  • 允许我在运行时使用固定数量的参数动态创建函数(在我的上下文中可以使用),但从源代码看,它似乎也在幕后使用了
    eval



⑨ 这是一个用F2Py创建的编译例程。我现在无法通过合理的努力来改变这一点。是的,这很令人伤心,从长远来看,我会设法解决这个问题,或者让这个问题得到解决,但现在让我们接受这个事实。

创建一个如下所示的函数。您可以编写一个脚本来动态地生成代码,使其尽可能长,但仍然将结果静态地保存在普通python文件中,以避免使用eval/exec

def function_maker(n_args, other_function):
    return [
        lambda: other_function(),
        lambda arg_0: other_function(arg_0),
        lambda arg_0, arg_1: other_function(arg_0, arg_1),
    ][n_args]
然后按如下方式使用:

my_function = lambda *args: other_function(args)
function_maker(2, other_function)(a, b)

高兴吧,因为你可以随心所欲地解包和打包论点。例如,
other_函数(*args)
与运行时的
other_函数(a、b、c)
相同。@cᴏʟᴅsᴘᴇᴇᴅ: 这是相同的–不适用于调用我的函数的例程。这正是我的问题。如果您可以从python调用这些例程,那么您可以使用
*
,除非您使用的是python1。这真的不足以继续下去,就目前而言,我认为除了评估之外,没有其他方法可以做到这一点。@cᴏʟᴅsᴘᴇᴇᴅ: 这些例程不是从Python中调用的(而是一些编译的C-API代码或类似代码),我无法控制它们的调用方式?这是用pyrex写的吗?赛顿?