2017-04-06 19 views
3

그래서, 이것은 뾰족하다. 나는 루이지 (luigi)와 시실리 (sciluigi)와 함께 일하고 있습니다.거짓말 isinstance

isinstance 검사는 sciluigi 패키지에, 나는 오히려 그 다음이 작은 문제 :

간단히 말하자면 위해 전체 sciluigi을 분기 할 클루 것, 나는 패키지의 클래스 중 하나를 (서브 클래스했다 luigi.LocalTarget) - 추가 기능을 추가합니다. ... isinstance 라인 만 'TargetInfo'개체를 확인하도록 설정되어 있기 때문에 실행이 단순히 실패합니다

sciluigi.dependencies.DependencyHelpers._parse_outputitem()

을 ... 그 기능이 잘 작동하지만, sciluigi 패키지의 개체 확인이있다 .

난 그냥 그렇게는 TargetInfo 개체로보고하고 전달 isinstance에 '거짓말'내 자식 클래스에게하면된다 싶습니다 무엇 :

용서는 사전에 질문 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 % 이잖아. 당신이 당신의 객체가 isinstance 검사를 통과 할 정도로 TargetInfo를 서브 클래 싱 할 필요가 같은

는 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) 

# ============================================================================== 
+2

그 단계를 생략 한 자체 구현으로 '_parse_outputitem'을 monkeypatch 할 수 없습니까? – karlson

+0

실제로 문제가있는 코드는 표시하지 않았습니다. [MCVE] (http://stackoverflow.com/help/mcve)를 만들고 실제 오류에 대한 세부 정보, 추적 코드 등을 제공하도록 노력하십시오. –

+0

@Karlson - 저는 monkeypatch 할 수 있지만, 우리는 sciluigi의 사용자 정의 구현을 가지고 있습니다. 나는 피하려고 노력하고있어. – RightmireM

답변

1

것 같습니다. 이처럼이있을 수 있습니다 루트 후손으로 TargetInfo이있는 경우 다른 기본 클래스가 충돌하는 메소드를 오버라이드 (override) 때문에 다음 클래스의 기능을 방해해서는 안

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

.

2

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에 할당하면됩니다. 그게 좋은 생각인지 아닌지 판단하기 위해 당신이 사용하고있는 도서관에 대해 충분히 알지 못합니다.

+0

매우 완전한 대답입니다. 정확히 맞아. 고맙습니다! – RightmireM