1

テスト中に、テストケースにリロードコマンドを追加して、すべてを手動でリロードしなくても、いくつかの異なる場所でコードを変更できるようにしました。リロードがテストの結果に影響を与えているように見えることに気付きました。

これが私がしたことです:

import mymodule
import mymodule.rules as rules

def testcase():
    reload(mymodule)
    reload(rules)

    # The rest of the test case

このように、または両方のリロードがコメントアウトされている場合はすべて正常に機能しますが、2回目のリロードをコメントアウトすると、テストの結果が異なります。モジュールがリロードされた後、モジュールからすべてのスクリプトをリロードする必要があることに気付いていないリロードプロセス中に発生する何かがありますか?他に説明はありますか?

これが適切かどうかはわかりませんが、ルールはパッケージ内の別のスクリプトであり、次の行が含まれています。

from mymodule import Rule
4

2 に答える 2

2

質問の情報はかなり曖昧であり、用語はかなり標準的ではありません。から

rules は、mymodule 内の別のスクリプトです。

それmymoduleは実際にはパッケージだと思いますが、インポート時に自動的にインポートされないようrulesです。これは、実行後に

import mymodule

はありませんmymodule.rulesが、実行後

import mymodule.rules as rules

モジュールrulesは の名前空間にインポートされますmymodule。(補足: 後者のコード行は、通常、 として記述されfrom mymodule import rulesます。)

最初のreload()ステートメントを実行すると、 の新しいコピーが取得されますがmymodule、これには含まれません。これは、2 番目のステートメントmymodule.rulesの後でのみ再作成されます。reload()

私はこの答えを得るために多くの推測をしなければならなかったので、間違っているかもしれません. ドキュメントreload()に見られるように、ステートメントには多くの微妙な点があるため、Python のインポート機構に精通している場合にのみ使用することをお勧めします。

(別の補足:rule.pyがパッケージ内に存在する場合mymodule、セットアップのように見えるため、そこで相対インポートを使用する必要があります。代わりに

from mymodule import Rule

やったほうがいい

from . import Rule

from __future__ import absolute_importまた、より透過的なインポート ルールをお勧めします。)

于 2012-07-27T16:59:56.197 に答える
1

何が問題を引き起こしているのか正確にはわかりませんが、reload().

docsによるとreload()

以前にインポートしたモジュールを再ロードします。

ただし、これをテストケースで実行している場合、モジュールをインポートしてからリロードするまでの間、モジュールに変更はありませんよね? 変更を加えるには、テスト ケースの実行時にこれらのファイルを変更する必要があると思いますが、これはおそらく良い考えではありません。

于 2012-07-27T17:00:25.223 に答える