web-dev-qa-db-ja.com

組み込み関数名を属性またはメソッド識別子として使用することは悪い習慣ですか?

組み込み関数名を変数識別子として使用しないことを知っています。

しかし、それらを属性またはメソッド識別子として使用しない理由はありますか?

たとえば、my_object.id = 5、または自分のクラスでインスタンスメソッドdictを定義しますか?

42
max

インタプリタを混乱させることはありませんが、あなたのコードを読む人々を混乱させるかもしれません。属性およびメソッドに組み込み名を不要に使用することは避けてください。

もう1つの悪影響は、組み込みのシャドウイングがほとんどのpython対応エディター(vi、emacs、pydev、idleなど)の構文ハイライターを混乱させることです。また、lintツールのいくつかはこの慣例について警告します。

37

はい、それは悪い習慣です。すぐには何も壊れないかもしれませんが、それでもコードの読みやすさは損なわれます。

PEP20から選択的に引用するには:

醜いよりも美しい方がいいです。
シンプルは複雑よりも優れています。
読みやすさは重要です。
実装が説明しにくい場合は、悪い考えです。

myobject.dict()への呼び出しを見ると、_myobject.__dict___を返すか、myobject.id()id(myobject)と同じものを返すと想定するのは自然なことです。

彼らは彼らが間違っていることを知ることが可能です。しかし、それは時間と努力を要し、おそらく彼らがそれを理解する間、いくつかの間違いにつながるでしょう。属性_myobject.object_id_number_の呼び出しははるかに長くなりますが、id(myobject)とは異なることが明確になります

16
James Polley

いいえ、それで結構です。オブジェクト参照が必要なため、組み込みオブジェクトをシャドウする方法はありません。

入力変数がpython builtinsを模倣している場合、関数について何度も行ったり来たりします。たとえば、Word bytesはpython builtin 、しかしバイトを解析するユーティリティライブラリを考えてみましょう:

def parse_bytes(bytes):
    pass

これは素晴らしい読みやすさだと主張しますが、pep8リンターはそれが好きではありません。代わりに

def parse_bytes(bytearray):
    pass

def parse_bytes(somebytes):
    pass

またはタイプヒントを使用する

def parse_bytes(b: bytes):
    pass

しかし、これらすべてはさらに悪いようです。変数名がinput...の場合も同じことが起こります。

一日の終わりには、いつもsomebytes

0
Adam Hughes