2012-09-13 38 views
13

Tôi đang sử dụng apscheduler và tôi đang cố gắng để vượt qua trong tham số cho hàm xử lý mà được gọi là khi công việc dự kiến ​​được đưa ra:thông số đi qua để apscheduler hàm điều khiển

from apscheduler.scheduler import Scheduler 
import time 

def printit(sometext): 
    print "this happens every 5 seconds" 
    print sometext 

sched = Scheduler() 
sched.start() 

sometext = "this is a passed message" 
sched.add_cron_job(printit(sometext), second="*/5") 

while True: 
    time.sleep(1) 

Việc làm này mang lại cho tôi những lỗi sau:

TypeError: func must be callable 

Có thể chuyển tham số vào trình xử lý chức năng hay không. Nếu không, có bất kỳ lựa chọn thay thế nào không? Về cơ bản, tôi cần mỗi công việc theo lịch trình để trả lại một chuỗi mà tôi chuyển vào khi tôi tạo lịch biểu. Cảm ơn!

Trả lời

12

printit(sometext) không phải là một cuộc gọi, đó là kết quả của cuộc gọi.

Bạn có thể sử dụng:

lambda: printit(sometext) 

Đó là một callable được gọi sau mà có lẽ sẽ làm những gì bạn muốn.

+0

ngọt nó hoạt động! Bạn có nghĩ rằng bạn có thể nhanh chóng giải thích lý do tại sao điều này hoạt động/cách sửa lỗi này? Cảm ơn! –

+0

Nó được giải thích. Bạn cần phải chuyển một hàm, tức là cái gì đó có thể được gọi. def foo(): pass "foo" là hàm "foo()" là giá trị trả về của việc gọi hàm đó. –

+0

@ still.Learning Python hỗ trợ tạo các hàm ẩn danh (tức là các hàm không bị ràng buộc với tên) tại thời gian chạy, sử dụng cấu trúc được gọi là "lambda". Đây là một chức năng bình thường -> def f (h): return h ** 10, và đây là một functin lambda -> g = lambda h: h ** 10, thông báo sự khác biệt ;) –

10

Do đây là kết quả đầu tiên tôi thấy khi có cùng một vấn đề, tôi thêm một câu trả lời Cập nhật:

Theo docs cho apscheduler hiện tại (v3.3.0) bạn có thể vượt qua cùng các đối số chức năng trong hàm add_job().

Vì vậy, trong trường hợp của OP nó sẽ là:

sched.add_job(printit, "cron", [sometext], second="*/5") 
+0

Nếu bạn làm đối số được đặt tên bạn nên có trước các đối số hàm công việc với arg. Ví dụ: args = [arg1, arg2] – Milso

Các vấn đề liên quan