2012-01-11 28 views
7

Đây là mã của tôi:đèo trống/chức năng noop/lambda như là đối số mặc định

def execute(f, *args): 
    f(args) 

đôi khi tôi muốn vượt qua không có chức năng f-execute, vì vậy tôi muốn f để mặc định cho hàm rỗng.

+1

lỗi gì? Và tại sao tham số của bạn có tên là 'function', nhưng bạn gọi' f'? –

+3

Bạn có thể nhận được thông báo lỗi 'tên chung 'f' không được định nghĩa' bởi vì, tốt,' f' không được xác định. Nếu bạn nhận được thông báo lỗi khác, vui lòng chỉ định thông báo lỗi nào (truy xuất đầy đủ, vui lòng). –

Trả lời

6

Tôi không hiểu rõ bạn đang cố gắng làm gì
Nhưng điều gì đó có thể phù hợp với bạn?

def execute(func=None, *args, **kwargs): 
    if func: 
     func(*args, **kwargs) 

Bạn cũng có thể thêm một tuyên bố khác để làm bất cứ điều gì bạn muốn.

+1

Vâng, nó hoạt động. Tôi đã cố gắng loại bỏ câu lệnh 'if' này. – Randomblue

+0

trong trường hợp này nếu hàm func là def func(): pass. Bạn không cần nếu. chỉ func (* args, ** kwargs) –

10

Vấn đề là đôi khi muốn vượt qua không có đối số để thực hiện, vì vậy tôi muốn hàm mặc định cho hàm trống.

trình tốt cho tôi:

>>> def execute(function = lambda x: x, *args): 
... print function, args 
... function(args) 
... 
>>> execute() 
<function <lambda> at 0x01DD1A30>() 
>>> 

tôi lưu ý rằng ví dụ bạn cố gắng sử dụng f trong việc thực hiện, trong khi bạn đã được gọi là tham số function. Nó có thực sự đơn giản như vậy không? ;)

Điều đó nói rằng, bạn cần phải hiểu rằng Python sẽ không có cách nào để nói rằng bạn muốn bỏ qua đối số mặc định trừ khi không có đối số nào cả, vì vậy execute(0) không thể hoạt động vì nó cố gắng xử lý 0 làm hàm .

+0

Xin lỗi, câu hỏi đã được viết một cách khủng khiếp. Tôi đã viết lại nó. – Randomblue

+6

Để làm cho nó thậm chí còn chung chung hơn, làm cho nó 'lambda * x, ** xx: None'. Bây giờ nó có hiệu quả một chức năng no-op phổ quát - nó chấp nhận bất kỳ số đối số và đối số từ khóa nào. –

6

Một chức năng ẩn danh trở về None thường là thích hợp không-op:

nhắn
def execute(func=lambda *a, **k: None, *args, **kwargs): 
    return func(*args, **kwargs) 
+0

Tôi đoán điều này có nghĩa là không có ký hiệu ngắn hơn cho 'lambda * a, ** k: None'. Tôi đã thử 'func = pass', nhưng tất nhiên điều đó không hiệu quả. – kasperd

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