4

私はこれについてあまりにも長い間考えてきましたが、何のアイデアも得られませんでした。

私はPythonスクリプトのフォルダーを持っています。それらはすべて同じ周囲の本体を持っています(文字通り、シェルスクリプトから生成しました)が、それらすべてとは異なるチャンクが1つあります。言い換えると:

Top piece of code (always the same)
Middle piece of code (changes from file to file)
Bottom piece of code (always the same)

そして今日、これは悪い考えであることに気づきました。たとえば、上部または下部のセクションから何かを変更したい場合は、それを行うためのシェル スクリプトを作成する必要があります。(それは難しいことではありません。コード的に非常に悪いようです)。

だから私がやりたいことは、次のような外側のpythonスクリプトを1つ持つことです:

Top piece of code
Dynamic function that calls the middle piece of code (based on a parameter)
Bottom piece of code

そして、フォルダー内の他のすべてのpythonファイルは、単にコードの中間部分になる可能性があります. ただし、通常のモジュールはここでは機能しません (私が間違っていない限り)。これは、引数から実行する必要があるコードを取得するためです。これは文字列であり、実行時まで実行する関数がわからないためです。 .

そこで、さらに 2 つの解決策を考えました。

  1. 特定のパラメーターに基づいて各スクリプトを実行する 1 つの if ステートメントを作成できます。以前のデザインよりもさらに悪いので、これを拒否しました。
  2. 私は使用できます:

    os.command(sys.argv[0] scriptName.py)

    スクリプトを実行しますが、 python を呼び出して python を呼び出すことは、私にはあまりエレガントではないようです。

では、他のアイデアはありますか?ありがとうございました。

4

6 に答える 6

4

別の可能な解決策は、繰り返しファイルのそれぞれにメインファイルから機能をインポートさせることです

from topAndBottom import top, bottom
top()
# do middle stuff
bottom()
于 2010-08-08T00:48:34.857 に答える
4

関数の名前を文字列として、モジュールの名前を文字列として知っている場合は、次のことができます

mod = __import__(module_name)
fn = getattr(mod, fn_name)
fn()
于 2010-08-07T23:51:09.287 に答える
2

すでに投稿されているいくつかの回答に加えて、テンプレート メソッドの設計パターンを検討してください。次のような抽象クラスを作成します。

class Base(object):
    def top(self): ...
    def bottom(self): ...
    def middle(self): raise NotImplementedError
    def doit(self):
        self.top()
        self.middle()
        self.bottom()

次に、すべてのプラグ可能なモジュールは、これから継承するクラスを作成し、関連するコードでBaseオーバーライドする必要があります。middle

Perhaps not warranted for this simple case (you do still have to import the right module in order to instantiate its class and call doit on it), but still worth keeping in mind (together with its many Pythonic variations, which I have amply explained in many tech talks now available on youtube) for cases where the number or complexity of "pluggable pieces" keeps growing -- Template Method (despite its horrid name;-) is a solid, well-proven and highly scalable pattern [[sometimes a tad too rigid, but that's exactly what I address in those many tech talks -- and that problem doesn't apply to this specific use case]].

于 2010-08-08T02:40:06.060 に答える
0

これはどう?

function do_thing_one():
   pass

function do_thing_two():
   pass

dispatch = { "one" : do_thing_one,
             "two" : do_thing_two,
           }

# do something to get your string from the command line (optparse, argv, whatever)
# and put it in variable "mystring"

# do top thing
f = dispatch[mystring]
f()
# do bottom thing
于 2010-08-08T02:06:08.347 に答える
0

モジュールのインポート(他の回答で説明されているように)は間違いなくこれを行うためのよりクリーンな方法ですが、何らかの理由でそれが機能しない場合は、あまりにも奇妙なことをしていない限り、exec. 基本的に、別のファイルの内容を、呼び出された時点で現在のファイルに含まれているかのように実行しますexecsourceこれは、Python が持つ、多くのシェルに含まれる種類のステートメントに最も近いものです。最低限、次のようなものが機能するはずです。

exec(open(filename).read(None))
于 2010-08-08T00:43:26.763 に答える
0

ただし、通常のモジュールはここでは機能しません (私が間違っていない限り)。これは、引数から実行する必要があるコードを取得するためです。これは文字列であり、実行時まで実行する関数がわからないためです。 .

それは問題なく動作します -__import__ビルトインを使用するか、レイアウトが非常に複雑な場合はimpモジュールを使用してスクリプトをインポートします。そして、module.__dict__[funcname]たとえば、関数を取得できます。

于 2010-08-07T23:52:01.297 に答える