35732


**環境**  
Windows10 Pro 64bit  
Python 3.6.1

下記のモジュール構成だったとします。

[code]

    main.py
    A/
        __init__.py
        a.py
        b.py
    
[/code]

A.a.func()はA.bでも使用されていますが、バグがあり修正する必要があります。ただし、モジュールA内のソースコード(A.a.py,
A.b.py)はできれば編集したくありません。

そのため、main.py内で、A.bが使用するA.a.funcだけを差し替えたいのです。  
しかし、main.py内で下記のように置き換えても、main.py内では置き換わりますが、A.b内で使用されるA.a.func()は置き換えることができませんでした。

[code]

    # main.py
    import A.a
    
    def custom_func():
        return 0
    
    setattr(A.a 'func', custom_func)
    
    # A/b.py
    from .a import func
    
    func()      # <= 置き換わっていない
    
[/code]

何か方法はないでしょうか？


CC BY-SA 3.0
2017-06-19T10:07:03.437
35713
2017-06-20T01:25:20.470
17238
question
python
Pythonで共用されるモジュールの一部の関数だけ実行時に差し替えたい


`setattr` を使うことで差し替えることが可能でしたよ。  
推測としては `setattr(A.a 'func', custom_func)` の実行よりも前に、 `A.b`
をうっかりimportしてしまっているコードがあるのでは? という印象です。

main.py

[code]

    import A.a
    
    
    A.a.f()  # => 'a!'が出力
    
    
    def custom_func():
        print('custom!!')
    
    
    setattr(A.a, 'f', custom_func)
    
    from A.a import f
    
    f()  # => 'custom!'が出力
    
    import A.b  # => 'custom!'が出力
    
[/code]

A/a.py

[code]

    def f():
        print('a!')
    
[/code]

A/b.py

[code]

    from .a import f
    
    
    f()
    
[/code]


CC BY-SA 3.0
2017-06-20T01:25:20.470
35732
2017-06-20T01:25:20.470
12274
35713
answer