Một biểu thức lambda phù hợp 'không làm gì' trong python?


80

Đôi khi tôi thấy mình muốn thực hiện các biểu thức lambda trình giữ chỗ 'không làm gì cả', tương tự như nói:

def do_nothing(*args):
    pass

Nhưng cú pháp sau là bất hợp pháp vì các biểu thức lambda cố gắng trả về bất kỳ thứ gì sau dấu hai chấm và bạn không thể trả lại pass.

do_nothing = lambda *args: pass

Vì vậy, tôi đã tự hỏi, liệu biểu hiện sau có phải là sự thay thế thích hợp cho những điều trên không?

do_nothing = lambda *args: None

do_nothinghàm trên trả về về mặt kỹ thuật None, nên có thể tạo một biểu thức lambda trả về Noneđể sử dụng như một biểu thức lambda giữ chỗ không? Hay là do luyện tập không tốt?


Nó hoạt động tương tự như do_nothinghàm, nhưng không rõ tại sao bạn cần sử dụng a lambdacho nó.
BrenBarn

Tôi muốn sử dụng lambdahoàn toàn để dễ đọc mã, vì cá nhân tôi không phải là người yêu thích các hàm lồng nhau và ứng dụng tôi muốn sử dụng biểu thức trong đó sẽ là một hàm lồng nhau thứ ba. Tôi cũng chỉ đơn giản là quan tâm đến các ý kiến ​​khác về việc sử dụng trope mã hóa này.
user3002473

1
Trong Python thành ngữ, hầu hết những nơi bạn cần một hàm do-nothing chấp nhận None, mặc dù nó không thể gọi được. Để dí dỏm:filter(None, alist)
kojiro

6
Vì tất cả các hàm không làm gì giống nhau, nên bạn chỉ có thể xác định do_nothingở một nơi và sau đó chuyển do_nothingbất cứ khi nào bạn muốn chuyển một việc không làm gì. Không cần phải định nghĩa lại nó bằng lambda mới (hoặc hàm def đầy đủ) mỗi khi bạn muốn sử dụng nó.
BrenBarn

mock.Mock()có thể là giả của bạn có thể gọi được, chấp nhận bất kỳ tham số nào. Nhưng nó trả về một Mock khác và nó có thể dẫn đến các lỗi kỳ lạ. Thay đổi nó thành mock.Mock(return_value=None)có thể vẫn còn lỗi vì bạn có thể cố gắng lấy một thuộc tính từ nó và nó sẽ hoạt động, trả về một Mock khác.
Ctrl-C

Câu trả lời:


99

Điều này:

def do_nothing(*args):
    pass

tương đương với:

lambda *args: None

Với một số khác biệt nhỏ trong đó một là một lambdavà một không. (Ví dụ: __name__sẽ có do_nothingtrên hàm và <lambda>trên lambda.) Đừng quên về **kwargs, nếu nó quan trọng với bạn. Các hàm trong Python không có return <x>trả về rõ ràng None. Đây là đây :

Một cuộc gọi luôn trả về một số giá trị, có thể là Không, trừ khi nó tạo ra một ngoại lệ.

Tôi đã sử dụng các hàm tương tự làm giá trị mặc định, ví dụ:

def long_running_code(progress_function=lambda percent_complete: None):
    # Report progress via progress_function.

Được rồi, cảm ơn vì lời khuyên! Có lẽ tôi sẽ đi theo gợi ý của BrenBarn về việc tạo một do_nothinghàm toàn cầu .
user3002473

39

Nếu bạn thực sự muốn có một chức năng đầy đủ, không cần làm gì, hãy đảm bảo sử dụng *args *kwargs .

noop = lambda *args, **kwargs: None

Trong tất cả các hành động vinh quang của nó

>>> noop = lambda *args, **kwargs: None
>>> noop("yes", duck_size="horse", num_ducks=100)
>>>

Ghi chú bên lề

Hãy tự giúp mình cho tương lai và bao gồm cả việc **kwargsxử lý. Nếu bạn đã từng cố gắng sử dụng nó ở đâu đó sâu trong mã của mình và bạn quên rằng nó không mất kwargs, thì việc không làm gì sẽ là Ngoại lệ:

In [2]: do_nothing('asdf', duck="yes")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-efbd722f297c> in <module>()
----> 1 do_nothing('asdf', duck="yes")

TypeError: <lambda>() got an unexpected keyword argument 'duck'

16

Đôi khi các hàm lambda được sử dụng để chuyển đổi dữ liệu và trong trường hợp đó, 'không làm gì cả' có nghĩa là trả về đầu vào, tức là

lambda x: x

Để trả lại không bạn có thể viết

lambda x: None


Điều đó không giống như một hàm không làm gì trả về Không có.
BrenBarn

4
Tôi thích suy nghĩ này. Nó giống như phép nhân identityhơn do_nothing. Có thể có một trường hợp để có một trong mỗi.
Peter Wood,

10

Đây là biểu thức lambda đơn giản nhất:

do_nothing = lambda: None

Không yêu cầu đối số và lợi nhuận bắt buộc tối thiểu.


2

Trong Python 3, bạn thậm chí không cần xác định bất kỳ hàm nào cho điều đó. Calling type(None)sẽ đưa bạn trở các NoneTypenhà xây dựng, mà bạn có thể sử dụng để làm gì: type(None)(). Hãy nhớ rằng hàm NoneTypetạo chỉ nhận 0 đối số.

Trong Tuy nhiên, Python 2 , việc tạo các phiên bản của NoneTypelà không thể, vì vậy lambda: Nonesẽ có ý nghĩa nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.