1

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

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 *

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

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

4

3 に答える 3

4

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

後者の解釈の場合、大きな問題はそのimport *部分です-それを使用しないことを示唆する多くの問題の中で、1つにぶつかることになります:それは、その時点でバインドされているモジュールレベルの名前のスナップショットを実行します(または、定義されている場合は、モジュールにリストされているもののみ__all__) -- 名前のバインディングに対する今後の変更は、以前にimport *.

template_moduleの名前空間をインポートするモジュールの名前空間にマージする必要があると思うのはなぜですか? 通常のimport template_module as tm. _ここで必要と思われるもの)。tm.thistm.that

于 2009-12-14T18:47:53.860 に答える
0

これにはファブリック中心のソリューションがあることがわかりました。
したがって、抽象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()
于 2009-12-15T04:23:00.380 に答える
0

ある場所でモジュールのプロパティを変更すると、他の場所でも同じになります。証拠:

ファイル「/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 もどこにでもあります。

于 2009-12-14T18:51:19.600 に答える