0

我是 Python 新手,正在开发一个自定义 CLI,它允许用户在 CLI 上动态定义函数(从 cmd.Cmd 模块派生的自定义 CLI 模块)。自定义命令模块中重写的 default() 方法将获取用户输入的字符串,并且必须执行代码,无论是动态函数定义还是其他自定义任务。即我的要求是将以下CLI代码动态转换为成员函数,以便用户可以从Cli对象执行该函数

  CLI:>def abc(self):print("New fn")
  CLI:>print(cli.abc()) # Cli object pre-created
  Output: New fn

默认方法将从 CLI 输入的字符串作为 args 获取。

  class CliCmd(cmd.Cmd):
         def default(self, func): # func = "def abc(self):print("New fn")"
             # Parse for function name
             funcName = func.split()[1].split("(")[0]
             exec(func) 
             setattr(self.__class__, funcName, ?) # How do I feed the function object

在较旧的 python 中,我可以在 dict 中执行 exec func.strip(),在 Python 3.2 中 exec 仅返回 None。所以,我不确定如何获取 abc() 的函数对象,我可以反过来使用 setattr 与类绑定。任何帮助将不胜感激。

4

1 回答 1

0

如果函数在全局命名空间中,你可以这样做:

setattr(self.__class__, funcName, globals()[funcName])

http://docs.python.org/3.3/library/functions.html#globals

于 2013-10-19T02:45:24.887 回答