我是Python新手并开发自定义CLI,允许用户在CLI上动态定义函数(从cmd.Cmd模块派生的Custom CLI模块)。自定义命令模块中的Overriden 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(),exec在Python 3.2中只返回None。所以,我不知道如何获取abc()的函数对象,我可以使用setattr将其与类绑定。任何帮助将不胜感激。
答案 0 :(得分:0)
如果函数位于全局命名空间中,则可以执行以下操作:
setattr(self.__class__, funcName, globals()[funcName])