2017-01-13 10 views
1

私は、モジュールを分割してコードを整理しやすくするための小さなアプリケーションを用意しています。「モジュールインポートから*」以外のグローバル名前空間からすべてをインポートする方法はありますか?

import module 

を私はその後、私はそのモジュールからアクセスしたい任意のオブジェクトのためのmodule.objectを使用する必要があります。これの欠点は、私が使用してインポートするすべてのモジュールのためにということでした。私はグローバルな名前空間を汚染したくない。この場合

は、私は、オブジェクトを呼び出すために

from module import * 

を使用する必要がないように適切なモジュール名でそれを埋めるためにしたいですモジュールを前に置く必要はありません。

これは、インポートまたはインポートからの貧弱な使用とは考えられない手段がありますか?

+4

を行うモジュールのインポート*から何 ''です。異なる構文を使用して同じことをすることができれば、それはあなたがそれをやっても貧弱な使い方になります。関数をモジュールに接頭辞付けするか、関数を明示的にインポートする必要があるという事実は、良い設計と何をすべきかです。 –

+1

だから、あなたのコードを「より構造化された」ものにしたいのですが、モジュール名なしでシンボルを直接参照したいですか? – DyZ

+0

私は、 'from module import *'はそれ自身のショートカットであり、シンボルはそのモジュールの前に置かなければならないことに同意します。 –

答えて

0

私はあなたがと言う必要がありますモジュールの名前を使用する必要があります。これは使い方の良い方法であり、コードに名前空間の混乱がなく、また非常に理解しやすいものになります。私は「非常に美しいではありませんが、動作しますが、それはあなたがドン場合には、頭に浮かぶと思います

import random as r 
# OR 
from random import randint as rint 

一つの解決策

コードをより美しくするために、あなたはasインポートを使用することができますグローバルな名前空間を汚染したくない場合は、を使用して、関数内などのインポート文を使用できます。例えば

>>> def a(): 
...  from random import randint 
...  x = randint(0,2) 
...  print x 
... 
>>> a() 
1 
>>> randint(0,2) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
NameError: name 'randint' is not defined 

この方法で、特定の機能のローカル名前空間は、モジュールからの値で満たされているが、グローバルなものはきれいです。

+0

モジュール_in_関数をインポートすることはとても悪い考えですhttp://stackoverflow.com/questions/128478/should-python-import-statements-always-be-at-モジュールのトップ – DyZ

+0

私はそれが最善の方法ではないことに同意しますが、それほど悪くはありません、ここを見てください:http://stackoverflow.com/questions/477096/python-import-coding-style/4789963 #4789963 –

2

インポートにアスタリスクを使用しないでください。だからあなたの質問に答えるために、私はありません、ただより良い方法がないと言うだろう:

import module 

module.method() 

OR

import really_long_module_name as mm 

mm.method() 

はここpep8ガイド「輸入」のセクションを見てみましょう: (インポート*から)https://www.python.org/dev/peps/pep-0008/#imports

ワイルドカードの輸入は、彼らがリーダーと多くの自動化ツールの両方を混乱させ、名前空間に存在している、それは不明どの名前にすると、避けるべきです。ワイルドカードのインポートには、パブリックAPIの一部として内部インターフェイスを再パブリッシュするための1つの防御可能なユースケースがあります(たとえば、オプションのアクセラレータモジュールの定義を持つ純粋なPython実装のインターフェイスを上書きする、上書きされたものはあらかじめわかっていない)。

具体的にはグロブリングよりも安全で、私が助けることができるのであれば、私は必要なものだけをインポートしようとします。私は新しいモジュールを学んでいるとき、私は全体をインポートしますし、それが良好な状態でだ後、私は特に、私は必要なメソッドをインポートして、背中やリファクタリング行く:

from module import method 

method() 
5

つの合理的な選択肢がでインポートします前に付ける短い名前。例えば。

import module as m 
m.foo() 

または明示的に使用する予定の名前をインポート:貧しい使用何

from module import (foo,bar) 
foo() 
関連する問題