Python에서 'tuple' object is not callable 라고 나오는군요.

chocoheim의 이미지

'Learning Python'책을 보고 있는데,
8장 마지막 즈음(원서:240p)에 timing.py 란 소스코드 실행이 안되네요.

소스코드 :

(makezeros.py)
def lots_of_appends() :
    zeros = []
    for i in range(10000) :
        zeros.append(0)

def one_multiply() :
    zeros = [0] * 10000 

(timings.py)
import time, makezeros

def do_timing(num_times, *funcs) :
    totals = {}
    for func in funcs : totals[func] = 0.0
    for x in range(num_times) :
        for func in funcs : 
            starttime = time.time()
            stoptime = time.time()
            #apply(func)
            elapsed = stoptime-starttime
            totals[func] = totals[func] + elapsed 
        for func in funcs : 
            print "Running %s %d times took %.3f seconds" % (func.__name__, num_times, totals[func])

do_timing(100, (makezeros.lots_of_appends(), makezeros.one_multiply()))

는 이렇구요. 실행결과는

Traceback (most recent call last):
  File "timings.py", line 16, in ?
    do_timing(100, (makezeros.lots_of_appends(), makezeros.one_multiply()))
  File "timings.py", line 14, in do_timing
    print "Running %s %d times took %.3f seconds" % (func.__name__, num_times, totals[func])
AttributeError: 'tuple' object has no attribute '__name__'

라고 나오는군요.
왜 그럴까요? :idea:
책에 쓰인 python은 1.5x 이고, 제컴에 깔린넘은 2.2.1 임다

saemaro의 이미지

이렇게 해보세요.

timing.py:

import time, makezeros

def do_timing(num_times, *funcs) :
    totals = {}
    for func in funcs : totals[func] = 0.0
    for x in range(num_times) :
        for func in funcs :
            starttime = time.time()
            apply(func)
            stoptime = time.time()
            elapsed = stoptime-starttime
            totals[func] = totals[func] + elapsed
    for func in funcs :
        print "Running %s %d times took %.3f seconds" % (func.__name__, num_times, totals[func])

do_timing(100, makezeros.lots_of_appends, makezeros.one_multiply)

def do_timing(...)에서 *funcs를 funcs로 고치거나, 아래 do_timing(100, ..)에서 두 함수 사이의 괄호를 빼야 합니다. 책 소스의 버그죠. 이 상황에서 *funcs는 do_timing의 나머지 argument들을 tuple로 씌워서 받은 것이니까요.

그리고 책 소스를 치실 때 들여쓰기 주의하세요 :)

chocoheim의 이미지

괄호를 뺐봤었는데, 이렇게 나오거든요.

Traceback (most recent call last):
  File "timings.py", line 16, in ?
    do_timing(100, makezeros.lots_of_appends(), makezeros.one_multiply())
  File "timings.py", line 14, in do_timing
    print "Running %s %d times took %.3f seconds" % (func.__name__, num_times, totals[func])
AttributeError: 'NoneType' object has no attribute '__name__'

튜플로 씌워서 받는 다는건 잘 모르고 있었네요. ^^; 감사.
감사받은 김에 이것도 해결해주세요~ :lol:

WaitplzplzWait

saemaro의 이미지

위쪽 제가 올린 소스를 참고하세요. 원래 소스와 다른 곳이 더 있습니다.

do_timing(100, makezeros.lots_of_appends(), makezeros.one_multiply()) 여기에서 두 '()' 를 빼주셔야 <procedure>가 전달됩니다. 그래야 apply(func)가 먹혀듭니다. '()'를 붙이면 저 <procedure>가 실행되어 return한 결과(여기서는 None)이 전달되거든요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.