インポート元のモジュールに変数を追加するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1902656

  •  19-09-2019
  •  | 
  •  

質問

私がやりたいことは次のようなものです:

template.py

def dummy_func():
    print(VAR)
# more functions like this to follow

fabfile.py
# this gets called by fabric (fabfile.org)
# safe to think of it as ant build.xml

import template
template.VAR = 'some_val'
from template import *

つまり、他のモジュールが必要な変数を「拡張」する必要があるテンプレートモジュールがあります。これは(オブジェクトの継承とは対照的に)機能的な方法で行うことができますか?

編集:もう少しコードを追加しました。

役に立ちましたか?

解決

「機能的な方法」が何を意味するのかわかりませんが、次のような意味ですか? 関数型プログラミング?それは起こりません(本質的にオブジェクトを変更しようとしているため、FPの逆です)。それとも「うまくいく方法」のような意味でしょうか?

後者の解釈の場合、大きな問題となるのは、 import * その一部 -- これを使用しないことを示唆する多くの問題のうち、次の 1 つに直面することになります。それはを実行します スナップショット その時点でバインドされているモジュール レベルの名前 (または、 __all__ モジュール内 (定義されている場合) -- 名前のバインディングに対する将来の変更は、以前に実行したモジュールには決して反映されません。 import *.

なぜ統合する必要があると思うのですか template_moduleの名前空間をインポートするモジュールの名前空間に追加しますか?普通にやってただけなら import template_module as tm, 、次に、関連するすべての名前を単純に次のように参照します。 tm.this, tm.that 問題なく動作します(使用の瞬間までのバインディングへのすべての変更を取得することを含みます。つまり、ここで必要と思われる「遅延バインディング」アプローチを使用します)。

他のヒント

あなたが一つの場所にモジュールのプロパティを変更する場合は、

、それはあまりにも他の場所で同じになります。証明ます:

ファイルを作成 '/tmp/test1.py':

imoprt os
os.path = '' # set os.path (module) to a mere string
os.zzz = 'zzz'

そして、

cd /tmp && python

>>> dir(test)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'z']
>>> test.os
<module 'os' from '/usr/lib/python2.6/os.pyc'>
>>> test.os.path
''
>>> import os
>>> os.path
''
>>> os.zzz
'zzz'

これはos.pathでもメインアプリケーションで空の文字列であり、zzzはあまりにもどこにでもある。

これはファブリック中心のソリューションを持ってい判明。
だから、抽象を持っているの some__fab__template.py のコンクリートの fabfile.py のそのいくつかの必要な変数(例えば、プロジェクト名を)貢献するテンプレート「を拡張する」必要があります。
私は、Fabのののenv の辞書を利用し、それを実装しました。
テンプレートファイルでは、env.VARを参照すると「具体的な」内の fabfile.py を使用すると、次の操作を行います。

from fabric.api import *
env.VAR = 'some value'
import some__fab__template

def dist():
    some__fab__template.dist()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top