2

私は非常に基本的な問題を抱えていますが、Python 学習者として何時間も苦労してきました。これまでのところ、ドキュメントは私に答えを提供していません。

問題は、このモジュールを Python スクリプトからインポートするときに、モジュールに含まれるインポート ステートメントが実行されないように見えることです。私が持っているものは次のとおりです。

次のようなファイル project.py (つまり、python ライブラリ) があります。

import datetime

class Project:
    """ This class is a container for project data """

    title        = ""
    manager      = ""
    date         = datetime.datetime.min

    def __init__( self, title="", manager="", date=datetime.datetime.min ):
    """ Init function with some defaults """

        self.title        = title
        self.manager      = manager
        self.date         = date

このライブラリは、後でfile.pyプロジェクトをインポートするスクリプト ( ) で使用され、次のように始まります。

import project

print datetime.datetime.min

このスクリプトを Python で実行しようとすると、問題が発生しfile.pyます。次に、Python は次の NameError で文句を言います。

Traceback (most recent call last):
  File "file.py", line 3, in <module>
    print datetime.datetime.min
NameError: name 'datetime' is not defined

これは、Python シェルから直接同じステートメント ( importand )を作成しようとした場合にも実際に発生します。print

datetimeモジュールは、呼び出した瞬間に自動的にインポートされるべきではありませんimport projectか?

よろしくお願いします。

4

2 に答える 2

4

モジュールは名前空間datetimeにのみインポートされます。としてアクセスprojectできますproject.datetime.datetime.minが、実際にはスクリプトに直接インポートする必要があります。

project.pyファイル (Projectクラスなど)で作成するすべてのシンボル (名前) はproject、他のモジュールからインポートしたものを含む名前空間になります。ただし、これは見かけほど非効率的ではありません。実際のdatetimeモジュールは、何度実行しても、まだ 1 回しかインポートされません。最初のものに続いてそれをインポートするたびに、名前を現在の名前空間にインポートするだけですが、実際にはモジュールの読み取りとインポートという面倒な作業をすべて行っているわけではありません。

于 2011-02-25T08:12:11.680 に答える
0

importステートメントを次とほぼ同等であると考えてみてください。

project = __import__('project')

事実上、importステートメントは単に変数への代入です。モジュールのロード時にいくつかの副作用が発生する可能性がありますが、スクリプト内から表示されるのは、名前への単純な割り当てだけです。

を使用してモジュールからすべての名前を取得できますが、コードが非常に脆弱になり、保守が困難になるため、from project import *そうしないでください。代わりに、モジュールをインポートするか、必要な名前を正確にインポートしてください。

したがって、コードの場合は次のようになります。

import datetime
from project import Project

あなたがしなければならないようなことです。

于 2011-02-25T08:26:27.050 に答える