创建 functools.partial *args & *来自已解析字符串的 kwargs
我正在传递一些字符串列表,我想使用 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 将其“包装”为单个字符串参数。
嗯......我描述得越多,我就越意识到除非这些标识符在此范围内有效,否则无法做到这一点......
I am being passed lists of strings that I would like to convert to method calls using functools.partial:
[ 'object1.method1(arg1, arg2, 4, key=value)', 'object2.method2(6, arg1)' ...]
It's easy to use a regexp to generate the necessary 'func' argument to functools.partial, but I'm having a devil of a time easily converting the string within the parens into valid *args and **kwargs to pass to functools.partial.
Every list item is guaranteed to be valid Python. I'm just unable to come up with a quick, easy way to convert strings such as 'arg1, arg2, 4, key=value' into somehthing functools.partial can use. What am I missing?
Update:
My appologies. I did forget vital information. The args are not valid identifiers within the scope of this procedure, hence 'eval' doesn't work. They are, however, correct in the scope in which the resulting partial objects will be used, so they can be "copied" as literals.
My current procedure returns a string 'arg1, arg2, 4, this=that'. If passed directly to functools.partial, functools.partial "wraps" it as a single string argument.
Hmmm.. the more I describe this, the more I realize that there's no way to do this unless these identifiers are valid within this scope...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我正在写另一个答案,因为如果我更改旧的答案,评论将根本无法反映内容。相反,如果事实证明这是一个更好的答案,我将撤回另一个答案。以下应该有效。
操作原理:
下面的代码集中在 2.-4 。假设进口。当然,由于作用域中的附加代码,还存在名称冲突的额外问题
I'm writing another answer, because if I change the old one, the comments won't reflect the the content at all. Instead, if this turns out to be a better answer, I will withdraw the other. The following should work.
Theory of Operation:
The following code concentrates on 2.-4. Imports are assumed. Of course there is an additional problem of names colliding, because of the additional code in the scope
使用 eval 函数并将函数名称替换为自定义函数名称非常简单,无需正则表达式。
Easy enough using the eval function and replace the function name with a custom one, no regex necessary.