4

コマンドラインから変数をスクリプトに渡すコードがいくつかあります。引数にfunctionは任意の値を渡すことができます。var問題はfunction、クラスに入れたときに変数が読み込まれないことfunctionです。スクリプトは次のとおりです。

import sys, os

def function(var):
    print var

class function_call(object):
    def __init__(self, sysArgs):
        try:
            self.function = None
            self.args = []
            self.modulePath = sysArgs[0]
            self.moduleDir, tail = os.path.split(self.modulePath)
            self.moduleName, ext = os.path.splitext(tail)
            __import__(self.moduleName)
            self.module = sys.modules[self.moduleName]
            if len(sysArgs) > 1:
                self.functionName = sysArgs[1]
                self.function = self.module.__dict__[self.functionName]
                self.args = sysArgs[2:]
        except Exception, e:
            sys.stderr.write("%s %s\n" % ("PythonCall#__init__", e))

    def execute(self):
        try:
            if self.function:
                self.function(*self.args)
        except Exception, e:
            sys.stderr.write("%s %s\n" % ("PythonCall#execute", e))

if __name__=="__main__":
    function_call(sys.argv).execute()

これは、 と入力することで機能し./function <function> <arg1 arg2 ....>ます。問題は、関数自体ではなく、クラスにある必要な関数を選択したいということです。私が試したコードはfunction(var):、クラス内にあることを除いて同じです。function_callこれを受け入れるようにクラスを変更する方法について、いくつかのアイデアを期待していました。

値を渡したい場合は、Hello-- のようにスクリプトを実行しますpython function_call.py function Hello。これにより、var変数が として出力されHelloます。

コマンドラインに変数を入力することで、コード全体でこの変数を使用できます。スクリプトが一連の関数である場合、このコードを使用して関数を選択することもできますが、特定のクラス内の関数を選択したいと考えています。代わりにpython function.py function hello、クラスにも入ることができます。python function.py A function hello.

また、関数外で使用するために値を保存する際に問題が発生したこともあります。誰かがこれを解決できれば、とても感謝しています。 _________________________________________________________________________________

修正コード。これは、現在私にとって機能するコードです。

class A:
    def __init__(self):
        self.project = sys.argv[2]
    def run(self, *sysArgs):
        pass
    def funct(self):
        print self.project

class function_call(object):
    def __init__(self, sysArgs):
        try:
            self.function = None
            self.args = []
            self.modulePath = sysArgs[0]
            self.moduleDir, tail = os.path.split(self.modulePath)
            self.moduleName, ext = os.path.splitext(tail)
            __import__(self.moduleName)
            self.module = sys.modules[self.moduleName]
            if len(sysArgs) > 1:
                self.functionName = sysArgs[1]
                self.function = getattr(A(), sysArgs[1])(*sysArgs[2:])
                self.args = sysArgs[2:]
        except Exception, e:
            sys.stderr.write("%s %s\n" % ("PythonCall#__init__", e))

    def execute(self):
        try:
            if self.function:
                self.function(*self.args)
        except Exception, e:
            sys.stderr.write("%s %s\n" % ("PythonCall#execute", e))


if __name__=="__main__":
    function_call(sys.argv).execute()
    inst_A = A()
    inst_A.funct()

すべての助けをありがとう。

4

2 に答える 2

4

あなたはgetattr役に立つかもしれません:

>>> argv = ['function.py', 'run', 'Hello']
>>> class A:
    def run(self, *args):
        print(*args)


>>> getattr(A(), argv[1])(*argv[2:])
Hello
于 2010-05-04T13:33:07.050 に答える
1

ではなく、次のように聞こえます。

self.function = self.module.__dict__[self.functionName]

あなたは次のようなことをしたいです(@SilentGhostが述べたように):

self.function = getattr(some_class, self.functionName)

(オブジェクト インスタンスではなく) クラスのメソッドを取得する際の注意が必要なのは、バインドされていないメソッドを取得することです。self.function を呼び出すときは、最初の引数として some_class のインスタンスを渡す必要があります。

または、問題のクラスを定義している場合は、classmethod またはstaticmethodを使用して、some_class.function_you_want_to_pick がバインドされた関数を返すようにすることができます。

于 2010-05-04T15:15:03.660 に答える