【发布时间】:2010-10-13 00:35:52
【问题描述】:
我正在传递我想使用 functools.partial 将其转换为方法调用的字符串列表:
[ 'object1.method1(arg1, arg2, 4, key=value)', 'object2.method2(6, arg1)' ...]
使用正则表达式为 functools.partial 生成必要的 'func' 参数很容易,但是我很容易将括号中的字符串转换为有效的 *args 和 **kwargs 以传递给functools.partial.
保证每个列表项都是有效的 Python。我只是无法想出一种快速、简单的方法来将诸如 'arg1, arg2, 4, key=value' 之类的字符串转换为 functools.partial 可以使用的东西。我错过了什么?
更新:
我的道歉。我确实忘记了重要信息。 args 不是此过程范围内的有效标识符,因此“eval”不起作用。但是,它们在使用结果部分对象的范围内是正确的,因此可以将它们“复制”为文字。 我当前的过程返回一个字符串 'arg1, arg2, 4, this=that'。如果直接传递给 functools.partial,functools.partial 会将其“包装”为单个字符串参数。
嗯……我描述得越多,我就越意识到除非这些标识符在此范围内有效,否则无法做到这一点……
【问题讨论】:
-
由于这些是部分的,因此是“arg1”、“arg2”等占位符,用于稍后提供的值,而不是可能会使用的文字“4”和“6”在创建部分?用于部分命名参数的占位符与文字语法是什么? “object1”是占位符吗?也许如果你展示了之前和之后的案例 - “对于字符串'blah',我会创建这个部分”。
-
object1、arg1、arg2、object2等在哪里定义?即范围。它们是在 locals() 或 globals() 中定义的,还是在您创建 functools.partial 函数的地方定义的? eval 甚至是一个可行的选择吗?