なぜ?
モジュールのすべての属性をインポートする必要があるため、ワイルドカードインポートを使用することがありますが、Vimスクリプトの1つ(構文チェッカーとしてflake8を使用)は常に警告を表示し、未定義の名前を検出できないことを通知します。
ワイルドカードインポートを使用することのその他の欠点はありますか?
なぜ?
モジュールのすべての属性をインポートする必要があるため、ワイルドカードインポートを使用することがありますが、Vimスクリプトの1つ(構文チェッカーとしてflake8を使用)は常に警告を表示し、未定義の名前を検出できないことを通知します。
ワイルドカードインポートを使用することのその他の欠点はありますか?
通常、を使用することはお勧めできませんfrom module import *
。ワイルドカードのインポートは、名前空間の汚染につながります。必要以上の名前をインポートしたため、インポートした名前を誤って参照した場合、目的のNameErrorが発生しない可能性があります。
また、ライブラリの将来のバージョンで追加の名前が追加された場合、他の名前がマスクされてしまい、見知らぬバグが発生する可能性があります。
from foo import bar
from spam import *
アップグレードspam
して、それが含まれるようになった場合、上の行のインポートspam.bar
が置き換えられます。foo.bar
ワイルドカードインポートを使用すると、微妙なバグが発生する可能性があります。
import sys
os = sys # just for the fun of it... :-D
>>> import os
>>> from foo import *
>>> os.path.join('p1', 'p2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'
これは、ライブラリのバージョンを更新するときに特に重要です。彼らは新しい変数を追加し、恐ろしい方法でコードを壊すかもしれないし、しないかもしれません。
本当にインポートを使用したい場合は*
、他のインポートと定義が優先されるように、常に最初にインポートを配置してください。
これまでのところ良い答えですが、PyDocsを参照することは常に素晴らしいことです:
特定のモジュールは、import *を使用するときに特定のパターンに従う名前のみをエクスポートするように設計されていますが、それでも本番コードでは悪い習慣と見なされます。
Martijnによる回答は、名前空間の汚染の問題に正しく対処していますが、ここでの回答のいずれも、私が最大の問題であると考えるものにまだ正しく対処していないと思います...明示的ではありません。
架空のモジュールについて考えてみましょう。
#foo.py
from bar import *
from baz import *
from qux import *
def breakfast(x):
with corn_beef_hash(x) as yummy:
for egg in yummy:
yield ham(egg.scrambled)
corn_beef_hash
数か月後、実際に何をしているのか思い出せないように見えるので、ドキュメントを見に行きます。ただし、またはcorn_beef_hash
の一部であったかどうかを思い出せない場合を除きます。これにより、追跡が困難になります。また、関数が最初に定義された場所がわかっている場合は、コードが読みやすくなるように、関数が何を実行するのかについてのヒントが得られます。bar
baz
qux
はい、あります。ワイルドカードを使用してすべてをインポートする場合、そのパッケージからすべてを取得してスクリプト内のインスタンスに変換する場合、これを行うためのより良い方法は、単にパッケージをインポートすることです。
元。パッケージをインポート
package.x
このようにして、命名の問題に遭遇することはありません。