python - 广泛使用 python 的 getattr 是不好的做法吗?

标签 python shell performance getattr

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

为了灵 active (主要是为了解析命令),我正在考虑更改我的设置,以便我使用 getattr(command) 来获取我需要的方法,然后在我的解析器结束时将参数传递给它.这种方法的另一个优点是每次添加新方法/命令时不必更新我的(当前静态实现的)命令字典。

我的问题有两个方面。首先,getattr有没有和eval一样的问题?其次,我的 shell 的效率会受到影响吗?我有多少方法/命令重要吗?我目前正在查看 30 条命令,这些命令最终可能会翻倍。

最佳答案

直接属性访问和使用 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()

您可以在文档或 http://www.doughellmann.com/PyMOTW/cmd/index.html 中阅读有关该模块的更多信息

关于python - 广泛使用 python 的 getattr 是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909423/

相关文章:

python - 提高缩小图像的准确性

xcode - 如何在后台在xcode中运行系统命令

bash - 需要用冒号分隔 Bash 中的字符串并分配给变量

c++ - 如何解决指针数组中的数据依赖性?

java - 将 PNG 加载到 OpenGL 性能问题 - Java 和 JOGL 比 C# 和 Tao.OpenGL 慢得多

python - 在 Pandas 数据框中添加列时出现 NaT 错误

Python opencv cv2.VideoCapture.read() 第一次运行后无限期卡住

python - 避免 Python 代码 redux 中的代码重复

linux - 寻找匹配 `"时意外的 EOF '

Javascript 对象与原语