Python 在'之前调用setattr;自我';归还
我怀疑这对我来说有点麻烦,但我正在使用Luigi和Sciluigi模块,它们在init返回“self”之前设置了一些关键参数。如果我试图在self返回后处理这些参数,那么Luigi.Parameter对象会以一种我不能做我需要做的事情的方式屏蔽它们 luigi和sciluigi类(使用它们时)不包含Python 在'之前调用setattr;自我';归还,python,setattr,luigi,Python,Setattr,Luigi,我怀疑这对我来说有点麻烦,但我正在使用Luigi和Sciluigi模块,它们在init返回“self”之前设置了一些关键参数。如果我试图在self返回后处理这些参数,那么Luigi.Parameter对象会以一种我不能做我需要做的事情的方式屏蔽它们 luigi和sciluigi类(使用它们时)不包含\uuuu init\uuuu。如果我尝试插入一个\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuu init\uuuu
。如果我尝试插入一个\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
所以一个Sciluigi类看起来像这样
class MyTask(sciluigi.task):
param1 = sciluigi.Parameter(default='Yes') #String only
param2 = sciluigi.Parameter(default='No') #String only
def out_target(self):
return sciluigi.TargetInfo(self, self.out)
def run(self):
with self.out_target().open('w') as foofile:
foofile.write('foo\n')
所以…我希望在实际返回“self”之前,可以通过setattr动态设置一些参数。但是setattr需要这个对象
我希望我能做点像
setattr(inspect.stack()[?][?], 'DynamicVar', sciluigi.Parameter(default='Yes') )
编辑:@Charles Duffy
嗯,我不确定什么信息最有用
第一个问题是,;我无法添加初始化。下面是实际代码,添加了\uuuu init\uuu
方法。如果我尝试运行它,我已经包含了结果错误。如果我尝试运行对\uuuuu init\uuuuu
class FileConverter(sciluigi.Task):
"""
"""
in_target = None # Mandatory
out = sciluigi.Parameter() # <file>
exepath = sciluigi.Parameter(default = "")
def __init__(self):
self.var = 'anything'
def out_target(self):
log.debug("In 'FileConverter.out_target'... ")
return sciluigi.TargetInfo(self, self.out)
def run(self):
result = None
command = ''.join([
self.exepath, _slash, "FileConverter ",
" -in ", self.in_target().path,
" -out ", self.out_target().path,
" -out_type ", self.file_type
])
log.info("RUNNING COMMAND: " + command)
result = self.ex(command)
log.info("result: " + result[1])
第二个问题是:
如果我等待self返回,我将无法再区分(例如使用上述代码)
in_target=None#必需
out=sciluigi.Parameter()#
如果我执行type(out)
,type会报告参数只是一个字符串(而不是sciluigi.parameter对象),因此如果我尝试使用'ìsinstance(out,sciluigi.parameter)…它会返回False
底线是:
我需要能够动态(以编程方式)设置sciluigi.Parameter对象,然后能够区分sciluigi.Parameter()对象变量(如out
)和“real”str()对象(如in_target
)
我希望这是有道理的 在构造函数中接受并以静默方式放弃参数,如下所示:
class FileConverter(sciluigi.Task):
def __init__(self, *_args, **_kwargs):
self.var = 'anything'
仅供将来参考,这个孤立问题的答案是“如何
setattr(<thisClassObject>, 'DynamicVar', sciluigi.Parameter(default='Yes') )
这是我如何解决这个问题的一个片段;)
deleteme.py
输出
预自返回的输出文件类型=
预自返回的normalvar类型=
正在启动工作流。。。
2017-02-27 12:08:37 |信息|--------------------------------------------------------------------------------
2017-02-27 12:08:37 |信息| SciLuigi:MyWorkflow工作流已启动(登录到日志/工作流_MyWorkflow_已启动_20170227 _110837 _278707.log)
2017-02-27 12:08:37 |信息|--------------------------------------------------------------------------------
2017-02-27 12:08:37 |信息|任务foowriter已启动
self.outfile类型=
self.normalvar类型=
2017-02-27 12:08:37 |信息|任务foowriter在0.001s后完成
正在启动工作流。。。
2017-02-27 12:08:37 |信息|--------------------------------------------------------------------------------
2017-02-27 12:08:37 |信息| SciLuigi:MyWorkflow工作流完成(日志中的工作流日志/工作流_MyWorkflow_已启动_20170227 _110837 _278707.log)
2017-02-27 12:08:37 |信息|--------------------------------------------------------------------------------
…的确是klugefest。您能提供足够的信息让人们重现您在尝试参数化构造函数时遇到的问题吗?(如果sciluigi
不是为接受未知参数而构建的,那么这类事情当然是可能的,但是有一些解决方法——例如,其中一些方法可能意味着手动调用父构造函数,而不是使用super()
)…也就是说:用正确的方法解决问题比发明一个乱七八糟的黑客更好。这并不是说你不能添加一个\uuuuu init\uuuu
。而是你不能添加一个不带参数的\uuuu init\uuuu
。谢谢你的想法,但不幸的是它不起作用。错误消息来自``__init_u``在父结构中更深层。在本例中是类“register”。您是对的,修复模块的深层类是最好的修复方法,但目前-我认为settattr kluge是我看到的唯一解决方法…ERROR…“return super(register,cls)。_uu调用_uu(*args,**kwargs)TypeError:uuu init获取了意外的关键字参数“实例名称”
class FileConverter(sciluigi.Task):
def __init__(self, *_args, **_kwargs):
self.var = 'anything'
setattr(<thisClassObject>, 'DynamicVar', sciluigi.Parameter(default='Yes') )
locals()['DynamicVar'] = sciluigi.Parameter(default='Yes') #String only
import sciluigi
class MyFooWriter(sciluigi.Task):
locals()['outfile'] = sciluigi.Parameter(default='./foo.txt') #String only
locals()['normalvar'] = 'Normalstring'
print "pre-self-returned outfile type =", type(outfile)
print "pre-self-returned normalvar type =", type(normalvar)
# locals()['param1'] =
def out_foo(self):
# raw_input("Enter...")
return sciluigi.TargetInfo(self, self.outfile)
def run(self):
print "self.outfile type =", type(self.outfile)
print "self.normalvar type =", type(self.normalvar)
# raw_input("Enter...")
with self.out_foo().open('w') as foofile:
foofile.write('foo\n')
class MyWorkflow(sciluigi.WorkflowTask):
def workflow(self):
print 'Starting workflow...'
foowriter = self.new_task('foowriter', MyFooWriter, outfile = 'testfile.txt')
return foowriter
if __name__ == '__main__':
sciluigi.run_local(main_task_cls=MyWorkflow)
pre-self-returned outfile type = <class 'sciluigi.parameter.Parameter'>
pre-self-returned normalvar type = <type 'str'>
Starting workflow...
2017-02-27 12:08:37 | INFO | --------------------------------------------------------------------------------
2017-02-27 12:08:37 | INFO | SciLuigi: MyWorkflow Workflow Started (logging to log/workflow_myworkflow_started_20170227_110837_278707.log)
2017-02-27 12:08:37 | INFO | --------------------------------------------------------------------------------
2017-02-27 12:08:37 | INFO | Task foowriter started
self.outfile type = <type 'str'>
self.normalvar type = <type 'str'>
2017-02-27 12:08:37 | INFO | Task foowriter finished after 0.001s
Starting workflow...
2017-02-27 12:08:37 | INFO | --------------------------------------------------------------------------------
2017-02-27 12:08:37 | INFO | SciLuigi: MyWorkflow Workflow Finished (workflow log at log/workflow_myworkflow_started_20170227_110837_278707.log)
2017-02-27 12:08:37 | INFO | --------------------------------------------------------------------------------