Я подозреваю, что это своего рода klugefest с моей стороны, но я работаю с модулями Luigi и Sciluigi, которые устанавливают ряд критических параметров ДО того, как «я» будет возвращено init. И если я попытаюсь обработать эти параметры ПОСЛЕ того, как возвращается self, объект Luigi.Parameter маскирует их таким образом, что я не могу сделать то, что мне нужно.
Классы luigi и sciluigi (при их использовании) не содержат __init__
. И если я попытаюсь вставить __init__
или вызвать super(ChildClass, self).__init__(*args, **kwargs)
... я получаю странные ошибки "неожиданный параметр".
Итак, класс 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')
ТАК... Я надеюсь, что смогу динамически установить некоторые параметры через setattr ДО того, как 'self' действительно будет возвращен. Но для setattr требуется объект.
Я надеялся, что смогу сделать что-то вроде...
setattr(inspect.stack()[?][?], 'DynamicVar', sciluigi.Parameter(default='Yes') )
РЕДАКТИРОВАТЬ: @Чарльз Даффи
Ну, я не уверен, какая информация будет наиболее полезной.
Первая проблема; Не могу добавить инициализацию. Фактический код приведен ниже с добавленным методом __init__
. Я включил результирующую ошибку, если попытаюсь запустить ее. Та же ошибка, если я попытаюсь запустить супервызов __init__
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])
Ошибка
2017-02-24 17:01:48 | WARNING | Will not run MyWorkflow(instance_name=sciluigi_workflow) or any dependencies due to error in deps() method:
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/luigi/worker.py", line 697, in _add
deps = task.deps()
File "/Library/Python/2.7/site-packages/luigi/task.py", line 572, in deps
return flatten(self._requires())
File "/Library/Python/2.7/site-packages/luigi/task.py", line 544, in _requires
return flatten(self.requires()) # base impl
File "/Library/Python/2.7/site-packages/sciluigi/workflow.py", line 105, in requires
workflow_output = self.workflow()
File "/Users/mikes/Documents/Eclipseworkspace/Bioproximity/OpenMS-Python-Luigi/site-packages/Bioproximity/sciluigi_tasks/PipelineTest1.py", line 33, in workflow
exepath = "/Applications/OpenMS-2.1.0/TOPP"
File "/Library/Python/2.7/site-packages/sciluigi/workflow.py", line 145, in new_task
newtask = sciluigi.new_task(instance_name, cls, self, **kwargs)
File "/Library/Python/2.7/site-packages/sciluigi/task.py", line 37, in new_task
newtask = cls.from_str_params(kwargs)
File "/Library/Python/2.7/site-packages/luigi/task.py", line 412, in from_str_params
return cls(**kwargs)
File "/Library/Python/2.7/site-packages/luigi/task_register.py", line 99, in __call__
h[k] = instantiate()
File "/Library/Python/2.7/site-packages/luigi/task_register.py", line 80, in instantiate
return super(Register, cls).__call__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'instance_name'
Второй вопрос:
Если я подожду, пока я вернусь, я больше не смогу различать (например, используя приведенный выше код)...
in_target = None # Mandatory
out = sciluigi.Parameter() # <file>
Если я делаю type(out)
, type сообщает, что параметр является просто строкой (а не объектом sciluigi.Parameter), поэтому, если я попытаюсь использовать `ìsinstance(out, sciluigi.Parameter)..., он вернет False.
Суть в следующем:
Мне нужно иметь возможность динамически (программно) устанавливать объекты sciluigi.Parameter и впоследствии иметь возможность различать объектную переменную sciluigi.Parameter() (например, out
) и «настоящий» объект str() (например, in_target
)
Я надеюсь в этом есть смысл.
sciluigi
не поддерживает неизвестные параметры, такие вещи возможны, безусловно, возможны, но есть существуют обходные пути — некоторые из них могут означать, например, вызов родительского конструкторы вручную, а не с помощьюsuper()
). - person Charles Duffy   schedule 24.02.2017__init__
. Дело в том, что вы не можете добавить__init__
, который не принимает параметры. - person Charles Duffy   schedule 25.02.2017