使用python';什么是getattr?

使用python';什么是getattr?,python,shell,performance,getattr,Python,Shell,Performance,Getattr,我正在创建一个类似于shell的环境。我最初处理用户输入的方法是使用字典将命令(字符串)映射到各种类的方法,利用函数是python中的第一类对象这一事实 出于灵活性的考虑(主要是为了解析命令),我正在考虑更改设置,以便使用getattr(command),获取所需的方法,然后在解析器末尾向其传递参数。这种方法的另一个优点是,每次添加新方法/命令时,不必更新(当前静态实现的)命令字典 我的问题有两个方面。首先,getattr和eval有相同的问题吗?第二,我的shell的效率会受到影响吗?我有多少

我正在创建一个类似于shell的环境。我最初处理用户输入的方法是使用字典将命令(字符串)映射到各种类的方法,利用函数是python中的第一类对象这一事实

出于灵活性的考虑(主要是为了解析命令),我正在考虑更改设置,以便使用getattr(command),获取所需的方法,然后在解析器末尾向其传递参数。这种方法的另一个优点是,每次添加新方法/命令时,不必更新(当前静态实现的)命令字典

我的问题有两个方面。首先,getattr和eval有相同的问题吗?第二,我的shell的效率会受到影响吗?我有多少方法/命令重要吗?我目前正在研究30个命令,这些命令最终可能会增加一倍

getattr和eval有相同的问题吗

否——使用
eval()
的代码维护起来非常烦人,可能会有严重的安全问题。调用
getattr(x,“foo”)
只是编写
x.foo
的另一种方法

我的外壳效率会受到影响吗


如果找不到该命令,则速度会明显减慢,但这还不够重要。只有在使用成千上万个条目进行基准测试时,您才会注意到这一点。

直接属性访问和使用getattr()之间的区别应该可以忽略不计。通过使用Python的
dis
模块比较这两种方法,可以区分两个版本的字节码之间的差异:

>>> import dis
>>> dis.dis(lambda x: x.foo)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_ATTR                0 (foo)
              6 RETURN_VALUE        
>>> dis.dis(lambda x: getattr(x, 'foo'))
  1           0 LOAD_GLOBAL              0 (getattr)
              3 LOAD_FAST                0 (x)
              6 LOAD_CONST               0 ('foo')
              9 CALL_FUNCTION            2
             12 RETURN_VALUE  
不过,听起来您正在开发一个shell,它与Python库
cmd
的命令行shell非常相似
cmd
允许您通过将命令名与
cmd.cmd
对象上定义的函数相匹配来创建执行命令的shell,如下所示:

import cmd

class EchoCmd(cmd.Cmd):
    """Simple command processor example."""

    def do_echo(self, line):
        print line

    def do_EOF(self, line):
        return True

if __name__ == '__main__':
    EchoCmd().cmdloop()

您可以在文档中或在

中阅读更多关于该模块的信息,如果您还没有真正了解pyparsing,那么就没有真正的理由用python编写自己的解析器。Fuzzy,我非常确定我能想到一个,这就是我做这件事的目的:学习。在开始这个当前项目之前,我不理解函数作为第一类对象的含义。不过,我非常感谢你的推荐。我会调查的。谢谢你的回复。正如我上面的评论,我写这个shell是为了学习。将来,如果我真的需要为某些生产目的编写shell,我将使用cmd。不过我不知道dis,谢谢你的推荐。