2013-08-13 6 views
1

В настоящее время я получаю ошибки в Python, но я не могу найти ихПередача функций к функциям

def dictionaryObjectParsed(): 
    a = [] 
    b = [] 
    a, b = zip(*(map(lambda x: x.rstrip('\n\r').split('\t'), open('/Users/settingj/Desktop/NOxMultiplier.csv').readlines()))) 
    for x in range(0,len(a)): 
     print a[x] 
     print b[x] 

def timer(f): 
    threading.Timer(1, timer, f).start() 
    print time.strftime('%I:%M:%S %p %Z') 

timer(dictionaryObjectParsed) 

Heres ошибка я получаю

Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 552, in __bootstrap_inner 
    self.run() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 756, in run 
    self.function(*self.args, **self.kwargs) 
TypeError: timer() argument after * must be a sequence, not function 

Я был в состоянии сделать это раньше, но Я думаю, что я сделал что-то, чтобы создать эту ошибку, что за черт :(

Я, очевидно, передаю аргументы функции таймера ...

EDIT

Я также попытался timer(dictionaryObjectParsed), но ничего ...

Кроме того, извините за Noobie вопрос это только мой второй день в питона ...: P

+1

Показать полный след и проверить, что код, который вы разместили здесь, идентичен коду, который производит указанную трассировку. – delnan

+0

'dictionaryObjectParsed()' фактически возвращает 'None', поэтому один аргумент передается' timer'. –

+0

Вы объясните, что вы надеетесь, эта строка будет делать: 'threading.Timer (1, timer) .start()'? Вы пытаетесь сделать какую-то временную рекурсию? –

ответ

3

Передайте функции без назвав его (опускать '()') ..

timer(dictionaryObjectParsed) 

и

def timer(f): 
    threading.Timer(1,f).start() 
    print time.strftime('%I:%M:%S %p %Z') 

вместо

threading.Timer(1,timer) 

Вы пытаетесь создать рекурсивную функцию таймера, я думаю, по ошибке. Ошибка, которую вы получаете, снова вызывает функцию «таймер», без параметра функции. Я думаю, что это была простая ошибка.


Ok, так что вы хотите рекурсивную функцию, поэтому попробуйте следующее:

def timer(f): 
    threading.Timer(1,timer,[f,]).start() 
    f() 
    print time.strftime('%I:%M:%S %p %Z') 

работал?

+0

i устал, что нет исправления :( – jsetting32

+0

нашел еще одну деталь, может быть, сейчас? отредактируйте ваш вопрос с ошибкой, которую вы получаете в любом случае ... – joaoricardo000

+0

это исправляет проблему сбоя, но теперь таймер не вызывается снова через секунду, функция выводится только один раз – jsetting32

0

У вас есть несколько ошибок.

Попробуйте это:

def timer(f): 
    f()       # NOTE THIS NEW LINE 
    threading.Timer(1,timer, f).start() # NOTE CHANGE ON THIS LINE 
    print time.strftime('%I:%M:%S %p %Z') 

timer(dictionaryObjectParsed)  # NOTE CHANGE ON THIS LINE 

Обратите внимание, что в последней строке, вы хотите передать функцию, а не является результатом вызова функции.

Обратите внимание, что на строке threading.Timer ... вы хотите передать достаточно аргументов, что последующие вызовы timer() имеют правильное количество аргументов.

Обратите внимание на новую строку - без нее dictionaryObjectParsed никогда не будет вызываться!

0

Фактический синтаксис инстанцировании Timer Instance является

threading.Timer(interval, function, args=[], kwargs={}) 

Есть 2 проблемы в вашей реализации

  1. Вы регистрируете функцию, которая принимает 1 аргумент без прохождения каких-либо аргументов в вашей зарегистрированной функции
  2. Вы рекурсивно регистрируете функцию вызывающего абонента в подпрограмме таймера.

Я считаю, что вы намерены зарегистрировать аргумент функции, а не функцию вызывающего абонента. Это в конечном итоге изменить реализацию в

def timer(f): 
    threading.Timer(1,f).start() 
    print time.strftime('%I:%M:%S %p %Z') 

Но из-за некоторые нечетные причины, вы хотите зарегистрировать функцию вызывающего абонента, необходимо также передать аргумент в качестве параметра threading.Timer, в соответствии с синтаксисом в документация

def timer(f): 
    threading.Timer(1,timer, f).start() 
    print time.strftime('%I:%M:%S %p %Z') 
Смежные вопросы