組み込み関数名を変数識別子として使用しないことを知っています。
しかし、それらを属性またはメソッド識別子として使用しない理由はありますか?
たとえば、自分のクラスでを書いmy_object.id = 5
たり、インスタンス メソッドを定義したりすることは安全ですか?dict
組み込み関数名を変数識別子として使用しないことを知っています。
しかし、それらを属性またはメソッド識別子として使用しない理由はありますか?
たとえば、自分のクラスでを書いmy_object.id = 5
たり、インスタンス メソッドを定義したりすることは安全ですか?dict
インタプリタを混乱させることはありませんが、コードを読む人々を混乱させる可能性があります。属性とメソッドに組み込み名を不必要に使用することは避けてください。
もう1つの悪影響は、シャドウイングビルトインがほとんどのPython対応エディター(vi、emacs、pydev、idleなど)の構文ハイライターを混乱させることです。また、一部のlintツールはこの方法について警告します。
はい、それは悪い習慣です。すぐに問題が発生することはないかもしれませんが、それでもコードの可読性が損なわれます。
PEP20から選択的に引用するには:
醜いより美しい方がいい。
単純な方が複雑な方が優れています。
読みやすさが重要です。
実装を説明するのが難しい場合、それは悪い考えです。
それへの呼び出しを見て、myobject.dict()
それが戻るだろうと仮定するのは自然ですmyobject.__dict__
、またはそれmyobject.id()
はと同じものを返しますid(myobject)
彼らが自分たちが間違っていることに気付く可能性があります。しかし、それは時間と労力を要し、おそらく彼らがそれを理解している間にいくつかの間違いにつながるでしょう。属性の呼び出しmyobject.object_id_number
ははるかに長くなりますが、id(myobject)
いいえ、大丈夫です。オブジェクト参照が必要なため、ビルトインをシャドウする方法はありません。
入力変数が Python のビルトインを模倣している場合、私は関数を何度も行ったり来たりします。たとえば、単語bytes
は python 組み込みですが、バイトを解析するユーティリティ ライブラリを考えてみましょう。
def parse_bytes(bytes):
pass
これは読みやすさに優れていると思いますが、pep8リンターはそれを好みません。代わりに私はできる
def parse_bytes(bytearray):
pass
def parse_bytes(somebytes):
pass
またはタイプヒントを使用する
def parse_bytes(b: bytes):
pass
しかし、これらはすべて悪いようです。input
変数名が...の場合も同じことが起こります
一日の終わりに私は通常一緒に行きますsomebytes