【问题标题】:Is it bad practice to use python's getattr extensively?广泛使用python的getattr是不好的做法吗?
【发布时间】:2010-05-26 00:21:50
【问题描述】:

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

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

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

【问题讨论】:

  • 如果你还没有看过 pyparsing pyparsing.wikispaces.com 你真的应该看过,那么 NO 真正有理由用 Python 编写自己的解析器。
  • 模糊,我很确定我能想到一个,这就是我这样做的目的:学习目的。在开始这个当前项目之前,我不明白函数作为一等对象的含义。不过,我确实很欣赏这个参考。我会调查的。

标签: python shell performance getattr


【解决方案1】:

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

但是,听起来您正在开发一个与 Python 库 cmd 执行命令行 shell 的方式非常相似的 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 上阅读有关该模块的更多信息

【讨论】:

  • 感谢您的回复。正如我上面的评论,我写这个 shell 是为了学习。将来,如果我真的需要为某些生产目的编写 shell,我将使用 cmd。不过我不知道dis,谢谢你的参考。
【解决方案2】:

getattr 和 eval 有同样的问题吗?

不——使用eval() 的代码维护起来非常烦人,并且可能存在严重的安全问题。调用getattr(x, "foo") 只是写x.foo 的另一种方式。

我的 shell 效率会受到影响吗

如果找不到命令,它会慢得不知不觉,但还不够重要。只有在进行基准测试时才会注意到它,有数万个条目。

【讨论】:

    猜你喜欢
    • 2012-12-08
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多