idPythonで変数に名前を付けるのはなぜ悪いのですか?
ID。
idPythonで変数に名前を付けるのはなぜ悪いのですか?
ID。
回答:
id() 基本的な組み込みです:
idモジュールの 組み込み関数のヘルプ__builtin__:id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
一般に、キーワードや組み込み関数を任意の言語で使用する変数名を使用することは、たとえ許可されていても、お勧めできません。
idに除去される予定でしたが、最終的には除去しないことにしました。元のコメントは編集できなくなったので、今後混乱を避けるために削除します。
str = 'an example word:cat!!'ます。これを実行しないと言っているPEPの中に何かありますか?
ではPEP 8 - Pythonのコードのためのスタイルガイド、セクションに次のガイダンスが表示されます記述:ネーミングスタイル:
single_trailing_underscore_:慣例により、Pythonキーワードとの競合を回避するために使用されます。
Tkinter.Toplevel(master, class_='ClassName')
したがって、質問に答えるために、このガイドラインを適用する例は次のとおりです。
id_ = 42
変数名に末尾のアンダースコアを含めると、意図が明確になります(PEP 8のガイダンスに詳しい人には)。
idですが、組み込みではなくキーワードです。これは、組み込みをシャドウするのが悪い理由を説明していません。
idは、オブジェクト(CPythonではそのメモリアドレスでもあります)のIDを提供する組み込み関数です。関数の1つに名前を付ける場合は、元の関数(またはCPython)を取得idするように言う必要があります。グローバルに名前を変更すると、小さなスクリプト以外では混乱を招きます。builtins.id__builtins__.idid
ただし、組み込みの名前を変数として再利用することは、使用がローカルである限り、それほど悪いことではありません。Pythonは持っている多くの(1)あなたは多くとにかく使用することはありません一般的な名前と(2)を持っていることを組み込み関数のを。これらをローカル変数として、またはオブジェクトのメンバーとして使用することは、コンテキストから明らかであるため、問題ありません。
例:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
魅力的な名前を持ついくつかの組み込み:
idfilelist、 dictmapall、 anycomplex、 intdirinputslicebuffersummin、 maxobjectidオブジェクトのメモリアドレスを返す関数がCPython実装の詳細であることは注目に値します。また、この関数は、任意の2つの現存するオブジェクトに対して異なる数を返すためにのみ必要であることにも注意する必要があります。オブジェクトがガベージコレクションされている場合、そのIDはリサイクルされます。
ここで不評なことを言うかもしれませんid()。ビジネスロジックではほとんど使用されない、かなり特殊な組み込み関数です。したがって、タイトで適切に記述された関数で変数名として使用することに問題はありません。idが組み込み関数を意味しないことは明らかです。
import this
idとにかく、ビルトインを使用する人はほとんどいません。とはいえ、同僚listがローカル変数を使用して組み込みをオーバーライドした場合、しばらく時間がかかりました。したがって、他の人々が言及する一般的なルールは、まだ理にかなっています。
他の人は混乱を招くと述べましたが、その理由を詳しく説明したいと思います。これは実話に基づいた例です。基本的に、私はidパラメーターを取るクラスを作成しますが、id後で組み込み関数を使用しようとします。
class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
予想される出力:
Created Employee 'Taylor Swift' at 0x7efde30ae910
実際の出力:
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
え?どこでintを呼び出そうとしていますか?それらはすべて組み込みです...
badge_idまたはと名付けてもid_、この問題はなかっただろう。
Pythonは動的言語であるため、通常、変数と関数に同じ名前を付けることはお勧めできません。id()はPythonの関数であるため、idという名前の変数を使用しないことをお勧めします。それを念頭に置いて、それはあなたが使うかもしれないすべての関数に適用されます...変数は関数と同じ名前を持つべきではありません。