4

我有一些代码可以从命令行将变量传递给脚本。我可以将任何值传递functionvararg。问题是,当我放入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 回答