web-dev-qa-db-ja.com

Python:すべての変数をインポートするにはどうすればよいですか?

私はPythonとプログラミング全般(せいぜい数週間)が初めてです。

Pythonおよびモジュールの使用に関して)、from a import *を使用して関数をインポートできることを認識しています。

入力する代わりに

a.sayHi()
a.sayBye()

私は言うことができます

sayHi()
sayBye()

私はそれが物事を大いに簡素化すると思いますここで、モジュール全体で使用したい変数の束があり、それらすべてを1つのpythonモジュールで定義します。上記のメソッドまたは同様に単純なメソッドで、これらの変数をインポートしますimport aを使用して、すべての変数の前にa.を付ける必要はありません。

理想的には、次の状況になります。

a.py

name = "Michael"
age = 15

b.py

some_function

if name == "Michael":
    if age == 15:
        print("Simple!") 

出力:

Simple!
34
user133446

あなたは自分で解決策を与えました:from a import *は問題なく動作します。 Pythonは、この点で関数と変数を区別しません。

>>> from a import *
>>> if name == "Michael" and age == 15:
...     print('Simple!')
...
Simple!
61
Stephan202

コンテキストのために、ほとんどのリンターはfrom module import *は警告を発します。名前空間の衝突が起こりやすく、今後の頭痛の種になるからです。

代替案として、あなたは

from a import name, age

フォームを作成し、nameageを直接使用します(a.プレフィックス)。 from [module] import [identifiers] formは、あるインポートが別のインポートをオーバーライドする時期を簡単に確認できるため、より将来性があります。

また、「変数」は、アドレス指定方法に関してPythonの関数と違いはありません。namesayByeなどのすべての識別子はある種のオブジェクトを指す識別子nameは文字列オブジェクトを指し、sayByeは関数オブジェクトを指し、ageは整数オブジェクトを指します。あなたはPythonに伝えます:

from a import name, age

「モジュールname内のageおよびaが指すオブジェクトを取得し、同じ識別子で現在のスコープ内をポイントする」と言っています。

同様に、インポート時に異なる識別子でそれらを指す場合は、使用できます

from a import sayBye as bidFarewell

形。現在のスコープではそれを指す識別子がbidFarewellであるのに対し、モジュールaではそれを指す識別子がsayByeであることを除いて、同じ関数オブジェクトが指し示されます。

33
cdleary

他の人が言ったように、

from module import *

モジュール変数もインポートします。

ただし、あなたはnot変数をインポートするだけで、オブジェクトへの参照であることを理解する必要があります。インポートするモジュールのインポートされた名前に他の何かを割り当てると、他のモジュールに影響しますwo n't

例:次のコードを含むモジュールmodule.pyがあると仮定します。

a= 1
b= 2

次に、他の2つのモジュールmod1.pymod2.pyがあり、どちらも以下を実行します。

from module import *

各モジュールでは、abの2つの名前が作成され、それぞれオブジェクト12を指しています。

さて、mod1.pyのどこかにグローバル名aに何か他のものを割り当てた場合:

a= 3

module.pyの名前amod2.pyの名前aは、引き続きオブジェクト1を指します。

したがって、読み取り専用グローバルが必要な場合はfrom module import *は機能しますが、読み取り/書き込みグローバルが必要な場合は機能しません。後者の場合は、import moduleをインポートしてから、値(module.a)を取得するか、モジュールのプレフィックスが付いた値(module.a= …)を設定する方が良いでしょう。

13
tzot

これを直接言ったわけではありませんが、これらのグローバル変数の操作に問題があると思われます。

関数内からグローバル変数を操作する場合は、グローバル変数を宣言する必要があります

a = 10
def x():
   global a
   a = 15

print a
x()
print a

そうしないと、a = 15はローカル変数を作成して15を割り当てるだけで、グローバルaは10のままです。

8
hasen