Python には C++ の using キーワードのようなものはありますか?
-
23-08-2019 - |
質問
C++ では、多くの場合、「using」キーワードを注意深く使用することで、コードの可読性を大幅に向上させることができます。次に例を示します。
void foo()
{
std::vector< std::map <int, std::string> > crazyVector;
std::cout << crazyVector[0].begin()->first;
}
になる
void foo()
{
using namespace std; // limited in scope to foo
vector< map <int, string> > crazyVector;
cout << crazyVector[0].begin()->first;
}
Python にも同様のものは存在しますか、それともすべてを完全に修飾する必要がありますか?
使用には落とし穴があり、範囲を適切に制限する必要があることを知っているという免責事項を追加します。
解決
ビルが言ったように、Pythonは建設を持っている。
from X import *
しかし、あなたはまた、明示的にモジュール(名前空間)から輸入したい名前を指定することができます:
from X import foo, bar, blah
このソースで識別子を見て、誰かがそれがどこから来るのか確認するためにすべてのインポートモジュールを通じて狩りする必要がないため、簡単に理解するために/コードをさらに読みやすくする傾向があります。ここに関連する質問です: Ambuguity の非存在下での名前空間仕様
の編集の:パックスさんのコメントに反応して、私はあなたにも、
のようなものを書くことができることを言及しますimport X.foo
が、その後、あなたが書く必要があります。
X.foo.moo()
だけではなく、
foo.moo()
このはもちろん、必ずしも悪いことではありません。私は通常、私は私のコードの最も鮮明になる感じどんなfrom X import y
とimport X.y
形態の混合物を使用しています。それは確かにある程度主観的なものです。
他のヒント
import X
または
from X import *
または
from X import a, b, c
Xは、あなたが使用したいのPythonモジュールであるところます。
あなたは私たちにあなたはニーズがクリーンアップだと思うPythonコードのサンプルを提供することが役立つだろう。
確かに、Pythonのダイナミズムが、これは些細なことができます。あなたが名前空間に深く埋もれたクラスがあった場合:foo.bar.baz.blahを、あなたが行うことができます:
def foo:
f = foo.bar.baz.blah
f1 = f()
デビッドの答えに加えて、次のようになります。
- 丸括弧を使用する必要があります
from X import (foo, bar, blah)
のために PEP8. - 完全な構文では、次のように、現在のモジュールのスコープ内でパッケージ名を新しい識別子に名前変更 (再バインド) できます。
from foo import bar as baz
.
マニュアルを調べることをお勧めします キーワードをインポートする, 、 __import__
組み込みと説明 システムモジュール さらに読み物として。
Pythonで別のオプションは、インポート時「と」構造です。たとえばます:
from foo import bar as baz
これは、おそらく同じ名前で、現在のモジュール内の既存のエンティティを隠し避けるために、エンティティが現在のモジュールに別の名前を取得することができ、現在のモジュールでfoo.bar
ようにbaz
をもたらすでしょう。
なお、
from foo import bar
bar
がfoo
パッケージのモジュールであっても動作します。これは、あなたが使用することを気にありますfoo.bar
の各機能/クラスを指定することなく、自分の名前空間の汚染を制限できます。彼らはbar.baz()
とbaz
から来たより良いアイデアを持っているコールが表示されますので、それはまた、あなたのコードの読者を支援します。