PEP 8では、python キーワードとの競合を避けるために単一の末尾アンダースコアを使用することを推奨していますが、標準の python モジュールのモジュール名との競合についてはどうでしょうか? それも単一の末尾のアンダースコアであるべきですか?
私は次のようなものを想像しています:
import time
time_ = time.time()
PEP 8では、python キーワードとの競合を避けるために単一の末尾アンダースコアを使用することを推奨していますが、標準の python モジュールのモジュール名との競合についてはどうでしょうか? それも単一の末尾のアンダースコアであるべきですか?
私は次のようなものを想像しています:
import time
time_ = time.time()
PEP 8 は直接対処していないようです。
キーワードと衝突している場合は、末尾のアンダースコアが明らかに必要SyntaxError
です。そうしないと、コードで a が発生するためです (または、本当に運が悪い場合は、意図したものとはまったく異なるものを意味するようにコンパイルします)。
したがって、名前を付けたいクラス属性、インスタンス属性、関数パラメーター、またはローカル変数があるコンテキストでも、代わりに使用class
する必要がありますclass_
。
しかし、同じことが には当てはまりませんtime
。そして、そのような場合、のアンダースコアを後置すべきではないtime
と思います。
これには前例があります。stdlib 自体の複数のクラスには、名前が付けられたメソッドまたはデータ属性がありますtime
(そして、それらのいずれにもありませんtime_
)。
もちろん、モジュールと同じスコープで名前を作成する場合もあります (通常はグローバル変数または関数を意味します)。次に、混乱の可能性がはるかに高くなりtime
、現在のスコープの残りのモジュールにアクセスする機能が隠されます。
90% の確率で、「これはグローバルであってはならない」という答えになると思います。
しかし、それでも残りの 10% は残ります。
また、名前が制限された名前空間にある場合もありますが、その名前空間は、time
モジュールにアクセスする必要がある関数内のローカル スコープです。
または、長くて複雑な関数 (これを使用するべきではありませんが、使用する場合もあります) で使用することもできます。time
モジュールではなくローカルであることが人間の読者に明らかでない場合、それはインタープリターを混乱させるのと同じくらい悪いことです。
ここで、残り時間の 99% は「別の名前を選ぶだけ」だと思います。
たとえば、次のコードを見てください。
def dostuff(iterable):
time = time.time()
for thing in iterable:
dothing(thing)
return time.time() - time # oops!
ここでの明白な答えは、変数の名前を変更するstart
ことt0
です。問題を解決するだけでなく、より意味のある名前でもあります。
しかし、それでも残りは 1% です。
たとえば、プロトコル仕様や .NET または ObjC インターフェイスなどから Python コードを生成するライブラリがあり、名前は制御できません。できることは、翻訳された名前にある種のプログラム的で明確な規則を適用することだけです。その場合、_
stdlib モジュール名とキーワードに追加するルールは良い考えかもしれません。
time
おそらく、変数の名前を任意に変更することはできず、(少なくとも潜在的に)モジュールと同じスコープ内に存在する必要があるなど、他の例を思い付くことができます。そのような場合は、_
接尾辞を使用します。