2012-05-27 3 views
0

파이썬 오류 "속성은 문자열이어야합니다" 나는 왜이 오류가 나타나는지? 내가 코드를 사용하는 경우 내가 아주 기본적인 실수를하고있는 경우gettattr, 내가 <pre><code>li=[] m=[method for method in dir(li) if callable(getattr(li,method))] print getattr(li,(str(i) for i in m)) </code></pre> <p><strong>오류</strong>을 생성</p>를 사용하여 내 코드에서 <code>getattr</code> 기능을 사용하려고

또한,

li=[] 
m=[method for method in dir(li) if callable(getattr(li,method))] 
for i in range(10): 
    print getattr(li,str(m[i])) 

은 그런 저를 용서, 내가 파이썬에 새로운 오전 오류

이없는 사람은 오류에 정교한하시기 바랍니다 . 감사합니다

: 동일한 원칙이이 코드에서 작용합니다 오류가없는 이유는 다음과 같습니다.

def info(object, spacing=10, collapse=1): 
    """Print methods and doc strings. 

    Takes module, class, list, dictionary, or string.""" 
    methodList = [e for e in dir(object) if callable(getattr(object, e))] 
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s) 
    print "\n".join(["%s %s" % 
        (method.ljust(spacing), 
         processFunc(str(getattr(object, method).__doc__))) 
        for method in methodList]) 

답변

3

좋아, 내 대답이 변경되었습니다. 당신은 발전기가 그들이하는 일과 다른 뭔가를 할 것으로 기대하는 것처럼 보입니다.

생성기를 함수에 전달하지 않고 생성기에서 생성 된 각 항목에 함수가 작동하도록하려면 생성기를 반복 한 다음 루프에서 원하는 함수를 수행하십시오. 목록을 통해 단지 루프 - -

그러나, 여기 당신이 발전기 식을 필요로하지 않습니다 예 : 당신이 발전기 식을 사용하려면 않은 경우

for method in m: 
    print(getattr(li, method)) 

, 당신은 건설 대신 여기를 사용할 수 있습니다 처음에 목록 :

for method in (method for method in dir(li) if callable(getattr(li, method))): 
    print(getattr(li, method)) 

당신이 뭘 하려는지를 들어, the inspect module 당신이하고있는 일을 많이 방지 할 수 있습니다하지만.

+0

그러나 어떤 시합 문자열 강제는 중요하지 않습니까? – sum2000

+0

파이썬에서는 문자열 강제 형변환이 아니므로, 단순히'str()'에 전달한 값으로부터 새로운 문자열을 생성하면됩니다. 그것은 생성자 표현식 내부에 있으므로 중요하지 않으므로 함수로 전달하는 것이 아닙니다. –

+0

OK, 당신은 발전기를 전달하는 대신에 먼저 내 주장을 전달할 것이라고 말하고 싶습니까? – sum2000

관련 문제