对伊森斯坦撒谎

2024-05-26 07:44:55 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,这是一个kluge。我和luigi和sciluigi一起工作。你知道吗

isinstance检查在sciluigi包中,对于这个小问题,我宁愿kluge它必须分支整个sciluigi:)

简单地说,我必须对包的一个类进行子类化(luigi.LocalTarget文件)-添加附加功能。这个功能很好用,但是在sciluigi包中有一个对象检查。。。你知道吗

sciluigi.dependencies.DependencyHelpers._parse_outputitem()

…这会导致运行失败,因为isinstance行被设置为只检查“TargetInfo”对象。你知道吗

我想做的就是告诉我的子类对isinstance撒谎,这样它就报告为TargetInfo对象并传递:d

事先请求原谅:D

def _parse_outputitem(self, val, targets):
    '''
    Recursively loop through lists of TargetInfos, or
    callables returning TargetInfos, or lists of ...
    (repeat recursively) ... and return all targets.
    '''
    if callable(val):
        val = val()
    if isinstance(val, TargetInfo):
        targets.append(val.target)
    elif isinstance(val, list):
        for valitem in val:
            targets = self._parse_outputitem(valitem, targets)
    elif isinstance(val, dict):
        for _, valitem in iteritems(val):
            targets = self._parse_outputitem(valitem, targets)
    else:
        raise Exception('Input item is neither callable, TargetInfo, nor list: %s' % val)
    return targets

错误消息:

2017-04-06 22:26:09,753 - PipeineTest1 - DEBUG - RunSubprocess:Traceback (most recent call last):
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:  File "/Library/Python/2.7/site-packages/luigi/worker.py", line 305, in check_complete
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:    is_complete = task.complete()
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:  File "/Library/Python/2.7/site-packages/luigi/task.py", line 482, in complete
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:    outputs = flatten(self.output())
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:  File "/Library/Python/2.7/site-packages/sciluigi/dependencies.py", line 99, in output
2017-04-06 22:26:09,754 - PipeineTest1 - DEBUG - RunSubprocess:    return self._output_targets()
2017-04-06 22:26:09,755 - PipeineTest1 - DEBUG - RunSubprocess:  File "/Library/Python/2.7/site-packages/sciluigi/dependencies.py", line 111, in _output_targets
2017-04-06 22:26:09,755 - PipeineTest1 - DEBUG - RunSubprocess:    output_targets = self._parse_outputitem(attrval, output_targets)
2017-04-06 22:26:09,755 - PipeineTest1 - DEBUG - RunSubprocess:  File "/Library/Python/2.7/site-packages/sciluigi/dependencies.py", line 132, in _parse_outputitem
2017-04-06 22:26:09,755 - PipeineTest1 - DEBUG - RunSubprocess:    raise Exception('Input item is neither callable, TargetInfo, nor list: %s' % val)
2017-04-06 22:26:09,755 - PipeineTest1 - DEBUG - RunSubprocess:Exception: Input item is neither callable, TargetInfo, nor list: <Bioproximity.common.luigi_extensions.local_target.ToppasLocalTarget object at 0x110e48190>

…不幸的是,这是Sciluigi作为输出提供的100%的错误回溯。你知道吗

sciluigi.dependencies.TargetInfo文件(对象)

class TargetInfo(object):
    '''
    Class to be used for sending specification of which target, from which
    task, to use, when stitching workflow tasks' outputs and inputs together.
    '''
    task = None
    path = None
    target = None

    def __init__(self, task, path, format=None, is_tmp=False):
        self.task = task
        self.path = path
        self.target = luigi.LocalTarget(path, format, is_tmp)

    def open(self, *args, **kwargs):
        '''
        Forward open method, from luigi's target class
        '''
        return self.target.open(*args, **kwargs)

# ==============================================================================

Tags: indebugselftargettaskparsevalisinstance
2条回答

看起来您只需要将TargetInfo子类化,这样您的对象就可以通过isinstance检查。你可以这样做:

class Foo(<whatever other base classes you have>, TargetInfo):
    ...

如果将TargetInfo作为根后代,则它不应干扰类的功能,因为其他基类将重写任何冲突的方法。你知道吗

我认为除了已有的LocalTarget子类之外,还需要创建一个TargetInfo子类。看起来您当前正在尝试将当前子类用作前者,而它是后者的实例。传递自定义类的实例不起作用,因为在同一个地方传递常规的LocalTarget也不起作用。你知道吗

尝试以下操作:

class MyTargetInfo(TargetInfo):            # pick your own name
    def __init__(self, task, path, *args): # you might want to explicitly name the args here
        self.task = task
        self.path = path
        self.target = ToppasLocalTarget(*args)

您需要将这个类的一个实例传递给函数,当您给它一个LocalTarget子类的实例时,这个函数给您带来了错误。正如我所评论的,您应该给这个类一个更好的名称,或者给需要显式传递给另一个类的参数命名(或者提供默认值)(而不是使用*args)。你知道吗

如果在MyTargetInfo.__init__中构造target不符合您的自定义类的需要(例如,您需要提前创建它或多次重用同一实例),您可以将一个已经存在的LocalTarget传递到构造函数中,然后将它分配给self.target,而不是创建一个新对象。我对你使用的图书馆了解不够,无法判断这是否是个好主意。你知道吗

相关问题 更多 >