Help us understand the problem. What is going on with this article?

import したモジュールの global 変数にアクセスする方法

More than 3 years have passed since last update.

レガシースクリプト群へ、変更を加える際はテストを義務付けた所、class の無い関数のみのスクリプトに対して、 unittest のコードを書いていたら、 global 変数を利用した関数のテストに出会い、global宣言出来ねーぞ!のエラーが出た。

※ Python2.7

実行

test_aaa.py
import aaa_module

class TestAAA(unittest.TestCase):
    def test_aaa
        aaa_module.aaa_func()

エラー

...
NameError: global name 'logger' is not defined

logger がない。あるあるだよね。

aaa_module.py
if __name__ == '__main__':
    logger = logging.getLogger('...')

global で宣言。あるあるだよね。

global の宣言(妄想)

仕方ないから unittest 側で 以下のようにやってみた。

実行

test_aaa.py
import aaa_module

class TestAAA(unittest.TestCase):
    def test_aaa
        global logger
        logger = logging.getLogger('...')
        aaa_module.aaa_func()

エラー

...
NameError: global name 'logger' is not defined

変わらない。なぜや・・・。

Python に global 変数なんて無かった

参考: Pythonでグローバル変数とか無い、正確にはモジュール内変数。だっけ?

モジュール内変数へのアクセス方法

module.global変数 = 値

実行

test_aaa.py
import aaa_module

class TestAAA(unittest.TestCase):
    def test_aaa
        aaa_module.logger = logging.getLogger('...')
        aaa_module.aaa_func()

まだまだPythonには未知なものが多い

sutoh
しゃちょうちゃん
https://aquari.hatenablog.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away