我有一些代码可以从命令行将变量传入脚本。我可以将任何值传递给function
var
arg。问题是,当我将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()
感谢您的帮助。
答案 0 :(得分:3)
您可能会发现getattr
有用:
>>> argv = ['function.py', 'run', 'Hello']
>>> class A:
def run(self, *args):
print(*args)
>>> getattr(A(), argv[1])(*argv[2:])
Hello
答案 1 :(得分: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将返回绑定函数。