【问题标题】:Is it bad practice to use a built-in function name as an attribute or method identifier?使用内置函数名称作为属性或方法标识符是不好的做法吗?
【发布时间】:2012-02-24 22:20:06
【问题描述】:

我知道永远不要使用内置函数名称作为变量标识符。

但是有什么理由不将它们用作属性或方法标识符?

例如,写my_object.id = 5是否安全,或者在我自己的类中定义实例方法dict

【问题讨论】:

标签: python namespaces python-3.x reserved-words naming-conventions


【解决方案1】:

它不会混淆解释器,但可能会使阅读您的代码的人感到困惑。应避免对属性和方法不必要地使用内置名称。

另一个不良影响是,在大多数支持 python 的编辑器(vi、emacs、pydev、idle 等)中,内置阴影会混淆语法高亮器。此外,一些 lint 工具会警告这种做法。

【讨论】:

    【解决方案2】:

    是的,这是不好的做法。它可能不会立即为您破坏任何东西,但它仍然会损害代码的可读性。

    选择性地引用 PEP20:

    美丽胜于丑陋。
    简单胜于复杂。
    可读性很重要。
    如果实现难以解释,那就是个坏主意。

    看到对myobject.dict() 的调用很自然地会假设它会返回myobject.__dict__,或者myobject.id() 返回与id(myobject) 相同的内容

    他们可能会发现自己错了;但这需要时间和精力,并且在他们弄清楚时可能会导致一些错误。调用你的属性myobject.object_id_number 更长,但更清楚地表明它与id(myobject) 不同

    【讨论】:

      【解决方案3】:

      不,没关系。由于需要对象引用,因此无法让它们隐藏内置。

      【讨论】:

      • 所以我可以使用任何有效的标识符作为属性名称,除了以__ 开头的标识符或与关键字相同的标识符?
      • 您根本不应该以__ 开头。 __foo get 被破坏了,如果它是私有财产,这不是问题。 __foo__ 表示它是 Python 内部。这样做没有问题,但这是不好的形式。
      • 取决于您所说的“很好”。代码还会运行吗?当然。使用内置名称是一种不好的做法,会导致混淆吗?是的,这应该足以让任何人避免使用内置类型/函数作为变量名。
      • @icdevppl:即使作为属性名称,正如问题所问的那样?
      【解决方案4】:

      当输入变量模仿 python 内置函数时,我经常在函数上来回走动。例如,bytes 这个词是 python 内置的,但考虑一个解析字节的实用程序库:

      def parse_bytes(bytes):
          pass
      

      我认为这具有很好的可读性,但 pep8 linters 不喜欢它。相反,我可以做

      def parse_bytes(bytearray):
          pass
      
      def parse_bytes(somebytes):
          pass
      

      或者使用类型提示

      def parse_bytes(b: bytes):
          pass
      

      但所有这些似乎都更糟。如果你的变量名是input...

      一天结束时,我通常会选择somebytes

      【讨论】:

      • 为什么不用字节_?
      猜你喜欢
      • 1970-01-01
      • 2020-08-18
      • 2016-09-19
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      相关资源
      最近更新 更多