2016-06-01 2 views
0

わずかに異なる2つのスクリプトを統一したいと思います。特定の部分を保持するpythonスクリプトを統合する

私の考えでは、ファイル(modX.py)の共通部分を維持し、二つの異なるエントリ・ポイント(A.pyB.py)を与えるために2つのファイルを作成することでした。共通部分は「インポート」によって呼び出されます。今

from modX import * 

、私はMODxので特定の部分を持つことができますどのように表示されません。 1つのアイデアは、A.pyB.pyに異なる値を持つ変数をテストすることでした。 modX.py

if 'is_A' in globals(): 
    my_string = "spam" 
else: 
    my_string = "eggs" 

A.py

is_A = True 
from modX import * 
print("I love {}".format(my_string)) 

どうmy_stringは、 "スパム" を得ることができますか?

関数に共通の部分を入れてみると、より平凡なものになる可能性がありますが、私はリファクタリングを避けることができますmodX.py

+0

あなたが言ったように、このアプローチは機能しますが、非平凡ではありません。これを試してみるとエラーになりますか? – saq7

+0

'modX'に引数を' globals() 'で渡すことはできません。 – martineau

答えて

1

私は、インポート時にモジュールに引数を渡す方法は決して分かりませんでしたが、非常に便利です。しかし、モジュールオブジェクトが最初にインポートされたときに および をクラスのインスタンスに置き換えることができるときに、sys.modulesディクショナリにキャッシュされるという事実を利用する制限を回避する方法があります。クラスインスタンス(self)に割り当てられた属性は、sys.modulesに格納された後、効果的にモジュールの属性になります。

ここではそれはあなたの例で使用され得る方法は次のとおりです。

modX.py

import sys 

class MyModule(object): 
    def __init__(self, arg=None): 
     if arg == 'is_A': 
      self.my_string = 'spam' 
     else: 
      self.my_string = 'eggs' 

     def called_by(arg): # nested function - no self 
      import sys 
      # Replace module entry with new instance of MyModule 
      sys.modules[__name__] = MyModule(arg) 

     self.called_by = called_by 

# Replace module entry in sys.modules[__name__] with a default instance of 
# MyModule (and create an additional reference to original module so it's not 
# deleted) 
_ref, sys.modules[__name__] = sys.modules[__name__], MyModule() 
del sys # clean-up namespace (optional) 

A.py

from modX import * 
called_by('is_A') # changes modX 
from modX import * # do it again to get modified version 

print("I love {}".format(my_string)) # -> I love spam 

B.py

from modX import * 

print("I love {}".format(my_string)) # -> I love eggs 
+0

コードスニペットが正常に機能します。この回避策は、維持するのが難しいような微調整を意味します。とにかく、興味深い説明をありがとう。 – Jona

+0

ようこそ。あなたはそれを維持することが困難であることについてより具体的にすることができますか?私は答えを改善することができるかもしれません... – martineau

+0

それは私のユースケースのためにちょっと難しいです。 2つのモジュールを分けるよりも、この部分を維持するのにもっと時間を費やすことができました。 – Jona

0

modX.globals()は、あなたがそのようにそれを行う)(

A.globals異なるオブジェクトであるため、それが動作していないことを理由は次のとおりです。modX.pyで :

def foo(): 
    if 'is_A' in globals(): 
     return "spam" 
    else: 
     return "eggs" 

A.py:

from modX import * 
modX.is_A = True 
print("I love {}".format(foo())) 

あなたはまた、で使用しようとすることができますモジュール、おそらくあなたはその方法を見つける。それがあなたを助けるかどうか教えてください。

+0

私はその解決策を知っていました(つまり、「すべての共通部分を関数に入れて」と言いました)。私は、モジュールの元の構造を維持しているものを探していました。 – Jona

関連する問題