【问题标题】:Passing arguments to python eval()将参数传递给 python eval()
【发布时间】:2014-02-01 17:24:03
【问题描述】:

我正在做基因编程框架,我需要能够执行一些代表完整 python 程序的字符串。我正在使用 Python 2.7。我有一个配置类,其中定义了原始集。让我们说

class Foo():
    def a(self,x):
        return x

    def b(self,y):
        return y

我正在使用 python 检查模块提取函数,并且我想创建一些包含导入和所有内容的可执行源代码。我最终得到一个看起来像这样的字符串

import sys

def a(x,y):
    return x

def b(y):
    return y

def main(x,y)
    lambda x,y: a(b(y),a(x,y))

main(*sys.argv)

我的问题是我不知道如何将命令行参数传递给我正在使用eval() 运行的字符串。 如何将命令行参数传递给我想使用eval() 运行的源文件?

编辑:有数以百万计的人,因此写入文件不是一个好选择。

编辑:我犯了一个错误。 eval() 方法仅用于表达式而不是语句,因此使用 exec() 是正确的方法

【问题讨论】:

  • 您到底想eval 做什么?此外,您的课程定义没有 self 作为第一个参数。
  • “执行个人”一词中的“个人”是什么意思?
  • @Dan 我认为他在杀人……从基因上讲。哎呀!
  • 您可以使用部分或动态创建的函数/代码对象来实现某些东西,但是如果您想坚持使用字符串和eval 构建东西,只需将您的字符串设置为Formatter 并运行@ 987654328@ 关于格式化字符串的迭代。
  • ab如何从Foo()中提取出来?顺便说一句,您的 a() 签名不合适。由于 Python 中的方法和函数是一等对象,因此您可以存储对它们的引用并根据需要调用它们,而无需为此使用eval()

标签: python code-generation eval argument-passing


【解决方案1】:
eval("function_name")(arg1, arg2)

或者如果你有一个参数列表:

arguments= [arg1,arg2,arg3,something]
eval("function_name")(*arguments)

【讨论】:

    【解决方案2】:

    粗略地说,您有三个选择。您可以继续使用eval(),实际上可以将字符串写入文件并使用subprocess.Popen() 执行它,或者您可以调用除main() 之外的函数,并在使用eval() 定义它之后调用它。

    exec()方式:

    在你要执行的字符串中

    main(#REPLACE_THIS#)
    

    评估函数

    import string
    def exec_with_args(exec_string,args):
        arg_string=reduce(lambda x,y:x+','+y,args)
        exec_string.replace("#REPLACE_THIS#", arg_string)
    

    子流程方式:

     import subprocess
     #Write string to a file
     exec_file=open("file_to_execute","w")
     exec_file.write(string_to_execute)
     #Run the python file as a separate process
     output=subprocess.Popen(["python","file_to_execute"].extend(argument_list),
         stdout=subprocess.PIPE)
    

    函数定义方式

    在你要执行的字符串中

    def function_name(*args):
        import sys
    
        def a(x,y):
            return x
    
        def b(y):
            return y
    
        def inner_main(x,y):
            lambda x,y: a(b(y),a(x,y))
    
        inner_main(*args)
    

    外码

    exec(program_string)
    function_name(*args)
    

    【讨论】:

    • 我正在生成 100 万人甚至更多,写入文件会大大减慢进程的速度,我将其作为最终选择,以防万一没有其他解决方案。我会尝试解决方案并通知您。
    • @George Kouzmov:听起来你正在做一些非常疯狂的元编程。您是否考虑过使用专为这种情况设计的 lisp?
    • @George Kouzmov:我添加了另一种方法,我认为它可能优于前两种。不过,我对代码生成知之甚少,所以如果你认为它会起作用,请告诉我。
    • 这是一个概念验证项目。我正在使用一个用于基因编程的 DEAP 框架来完成大部分工作。但是,我正在通过网络评估个人,因此需要源代码。问题是 DEAP 不提供该功能,所以我想生成个体,这样我就可以在不需要框架的情况下轻松执行它们,而且我使用的所有框架都在 python 中,或者至少是最好的,所以这不是选项。
    • 就在 10 分钟前,我想出了第三个解决方案,但是我发现 eval() 函数定义有问题,你只能使用表达式,所以这是一个错误,我必须重新定义我的问题,显然 exec 是更好的选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2014-02-13
    • 2018-09-29
    相关资源
    最近更新 更多