Передайте значение в Python Class через командную строку - PullRequest
4 голосов
/ 04 мая 2010

У меня есть некоторый код для передачи переменной в скрипт из командной строки. Я могу передать любое значение в 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()

Спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 04 мая 2010

вы можете найти getattr полезным:

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


>>> getattr(A(), argv[1])(*argv[2:])
Hello
1 голос
/ 04 мая 2010

Звучит скорее, чем:

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

Вы хотите сделать что-то вроде (как упоминалось @SilentGhost):

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

Хитрость при извлечении метода из класса (не экземпляра объекта) заключается в том, что вы собираетесь вернуть несвязанный метод. Вам нужно будет передать экземпляр some_class в качестве первого аргумента при вызове self.function.

В качестве альтернативы, если вы определяете рассматриваемый класс, вы можете использовать classmethod или staticmethod , чтобы убедиться, что some_class.function_you_want_to_pick вернет связанную функцию.

...