80

複数のファイルに分割したいコードがあります。matlabでは、ファイルを呼び出すだけでよく.m、特に何も定義されていない限り、呼び出されたコードの一部であるかのように実行されます。例(編集済み):
test.m(matlab)

function [] = test()
    ... some code using variables ...
    test2

test2.m(matlab)

... some more code using same variables ...

呼び出しtestは、test2のコードと同様にtestのコードを実行します。

Pythonが外部ファイルに入れる同様の方法はあり... some more code ...ますか?それは、それが呼び出されたファイルにあるかのように単純に読み取られますか?

4

4 に答える 4

75

もちろん!

#file  -- test.py --
myvar = 42
def test_func():
    print("Hello!")

現在、このファイル( "test.py")は、Pythonの用語では「モジュール」です。インポートできます(にある限りPYTHONPATH)現在のディレクトリは常ににPYTHONPATHあるのでuse_test、同じディレクトリから実行されている場合はtest.py、すべて設定されています。

#file -- use_test.py --
import test
test.test_func()  #prints "Hello!"
print (test.myvar)  #prints 42

from test import test_func #Only import the function directly into current namespace
test_func() #prints "Hello"
print (myvar)     #Exception (NameError)

from test import *
test_func() #prints "Hello"
print(myvar)      #prints 42

複数のファイルを1つのモジュールとして扱うことができる特別なファイルを使用するだけでなく、できることはたくさんありますが__init__.py、これはあなたの質問に答えます。残りは別の機会に残すと思います。

于 2012-09-13T18:38:29.983 に答える
47

私は今Pythonでモジュールの使用法を研究しており、Markusが上記のコメントで尋ねる質問(「モジュールに埋め込まれているときに変数をインポートする方法は?」)に2つの観点から答えると思いました。

  1. 変数/関数、および
  2. クラスプロパティ/メソッド。

Markusの変数の再利用を示すために、メインプログラムf1.pyを書き直す方法は次のとおりです。

import f2
myStorage = f2.useMyVars(0) # initialze class and properties
for i in range(0,10):
    print "Hello, "
    f2.print_world()
    myStorage.setMyVar(i)
    f2.inc_gMyVar()
print "Display class property myVar:", myStorage.getMyVar()
print "Display global variable gMyVar:", f2.get_gMyVar()

再利用可能なモジュールf2.pyを書き直す方法は次のとおりです。

# Module: f2.py
# Example 1: functions to store and retrieve global variables
gMyVar = 0
def print_world():
    print "World!"
def get_gMyVar():
    return gMyVar # no need for global statement 
def inc_gMyVar():
    global gMyVar
    gMyVar += 1  

# Example 2: class methods to store and retrieve properties
class useMyVars(object):
    def __init__(self, myVar):
        self.myVar = myVar
    def getMyVar(self):
        return self.myVar
    def setMyVar(self, myVar):
        self.myVar = myVar
    def print_helloWorld(self):
        print "Hello, World!"

f1.pyを実行すると、出力は次のようになります。

%run "f1.py"
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Hello, 
World!
Display class property myVar: 9
Display global variable gMyVar: 10

Markusのポイントは次のようになると思います。

  • モジュールのコードを複数回再利用するには、モジュールのコードを関数またはクラスに配置します。
  • モジュールにプロパティとして格納されている変数を再利用するには、クラス内のプロパティを初期化し、「getter」メソッドと「setter」メソッドを追加して、変数をメインプログラムにコピーする必要がないようにします。
  • モジュールに格納されている変数を再利用するには、変数を初期化し、getter関数とsetter関数を使用します。セッター関数は、変数をグローバルとして宣言します。
于 2013-12-28T19:37:42.810 に答える
23

Pythonにはインポートと名前空間があり、これは優れています。Pythonでは、次のように現在の名前空間にインポートできます。

>>> from test import disp
>>> disp('World!')

または名前空間を使用する場合:

>>> import test
>>> test.disp('World!')
于 2012-09-13T18:38:21.047 に答える
5

Pythonでも、2番目のファイルをインポートするだけで同じことができます。インポートすると、最上位のコードが実行されます。これはせいぜい厄介で、良いプログラミング手法ではないことをお勧めします。コードをモジュールに整理したほうがいいでしょう

例:

F1.py:

print "Hello, "
import f2

F2.py:

print "World!"

実行時:

python ./f1.py
Hello, 
World!

明確にするために編集:私が提案した部分は「乱雑」でありimport、個別のソースファイルの作成ではなく、出力を生成する副作用のためにのみステートメントを使用しています。

于 2012-09-13T18:38:54.913 に答える