52

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

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

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

4

4 に答える 4

42

インタプリタを混乱させることはありませんが、コードを読む人々を混乱させる可能性があります。属性とメソッドに組み込み名を不必要に使用することは避けてください。

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

于 2012-02-02T08:59:06.130 に答える
19

はい、それは悪い習慣です。すぐに問題が発生することはないかもしれませんが、それでもコードの可読性が損なわれます。

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

醜いより美しい方がいい。
単純な方が複雑な方が優れています。
読みやすさが重要です。
実装を説明するのが難しい場合、それは悪い考えです。

それへの呼び出しを見て、myobject.dict()それが戻るだろうと仮定するのは自然ですmyobject.__dict__、またはそれmyobject.id()はと同じものを返しますid(myobject)

彼らが自分たちが間違っていることに気付く可能性があります。しかし、それは時間と労力を要し、おそらく彼らがそれを理解している間にいくつかの間違いにつながるでしょう。属性の呼び出しmyobject.object_id_numberははるかに長くなりますが、id(myobject)

于 2012-02-02T08:59:03.963 に答える
11

いいえ、大丈夫です。オブジェクト参照が必要なため、ビルトインをシャドウする方法はありません。

于 2012-02-02T08:47:21.620 に答える
0

入力変数が 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

于 2020-02-26T22:30:45.160 に答える