【问题标题】:Get function from string containing the full name从包含全名的字符串中获取函数
【发布时间】:2014-04-03 13:22:54
【问题描述】:

我有一个类似的字符串:

str = "pwd.getpwuid(1000)"

现在,如果我尝试 eval() 它可能会引发异常,因为我还没有导入 pwd(或者如果我有的话可能不会)。

所以我决定编写一个解析器:将字符串拆分为“。”并得到一个列表:

lis = ["pwd", "getpwuid(1000)"]

然后取lis[0],如果不包含"("")"我打电话

importlib.import_module(lis[0])

然后再次进行评估。

我可以把同样的事情做得更好吗?

【问题讨论】:

  • 还不错,虽然你一开始为什么会遇到这种情况?
  • 这有点复杂,但我不能做不同的!
  • 这个问题似乎是题外话,因为它属于codereview.stackexchange.com
  • @jonrsharpe,但是 OP 正在寻找他的代码的替代方法,我想这应该是可以接受的。
  • 如果函数前面的前缀是某个对象怎么办?或者如果它是另一个模块中的某个对象?

标签: python eval python-importlib


【解决方案1】:

如何用一些正则表达式拆分 lis[2] 中函数的位置参数和 lis[3] 中的命名参数并做

lib = importlib.import_module(lis[0])
lib.__dict__[lis[1]](*list[2],**list[3])

【讨论】:

  • 这理所当然地认为 lis[1] 只是函数的名称,而不是它的参数
【解决方案2】:

找到解决办法:

我必须将字符串更改为包含函数体:

str = "(lambda x: __import__('pwd').getpwuid(x))(1000)"

eval() 就可以了!

(lambda 或 def 显然是一样的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2020-08-26
    • 2014-12-23
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多