Bạn có thể, đại loại, trong Python 3.6 trở lên bằng cách sử dụng các chú thích biến PEP 526 . Bạn có thể chú thích biến mà bạn gán lambda
kết quả với biến typing.Callable
chung :
from typing import Callable
func: Callable[[str, str], int] = lambda var1, var2: var1.index(var2)
Điều này không đính kèm thông tin gợi ý kiểu vào chính đối tượng hàm, chỉ với không gian tên bạn đã lưu trữ đối tượng, nhưng đây thường là tất cả những gì bạn cần cho mục đích gợi ý kiểu.
Tuy nhiên, bạn cũng có thể chỉ sử dụng một câu lệnh hàm để thay thế; lợi ích duy nhất mà một lambda
cung cấp là bạn có thể đặt một định nghĩa hàm cho một biểu thức đơn giản bên trong một biểu thức lớn hơn. Nhưng lambda ở trên không phải là một phần của một biểu thức lớn hơn, nó chỉ là một phần của một câu lệnh gán, ràng buộc nó với một tên. Đó chính xác là những gì một def func(var1: str, var2: str): return var1.index(var2)
tuyên bố sẽ đạt được.
Lưu ý rằng bạn cũng không thể chú thích *args
hoặc **kwargs
đối số riêng biệt, như tài liệu cho Callable
các trạng thái:
Không có cú pháp để chỉ ra các đối số tùy chọn hoặc từ khóa; các kiểu hàm này hiếm khi được sử dụng làm kiểu gọi lại.
Giới hạn đó không áp dụng cho giao thức PEP 544 có phương pháp__call__
; sử dụng điều này nếu bạn cần một định nghĩa biểu đạt về những lập luận nào nên được chấp nhận. Bạn cần Python 3.8 hoặc cài đặt typing-extensions
dự án cho một backport:
from typing-extensions import Protocol
class SomeCallableConvention(Protocol):
def __call__(var1: str, var2: str, spam: str = "ham") -> int:
...
func: SomeCallableConvention = lambda var1, var2, spam="ham": var1.index(var2) * spam
Đối với chínhlambda
biểu thức , bạn không thể sử dụng bất kỳ chú thích nào (cú pháp mà gợi ý kiểu của Python được xây dựng). Cú pháp chỉ có sẵn cho các câu lệnh hàm.def
Từ PEP 3107 - Chú thích hàm :
cú pháp của lambda không hỗ trợ chú thích. Cú pháp của lambda có thể được thay đổi để hỗ trợ các chú thích, bằng cách yêu cầu dấu ngoặc đơn xung quanh danh sách tham số. Tuy nhiên, nó đã được quyết định không thực hiện thay đổi này vì:
- Nó sẽ là một thay đổi không tương thích.
- Lambda's dù sao cũng bị vô hiệu hóa.
- Lambda luôn có thể được thay đổi thành một hàm.
Bạn vẫn có thể đính kèm các chú thích trực tiếp vào đối tượng, function.__annotations__
thuộc tính là một từ điển có thể ghi:
>>> def func(var1: str, var2: str) -> int:
... return var1.index(var2)
...
>>> func.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
>>> lfunc = lambda var1, var2: var1.index(var2)
>>> lfunc.__annotations__
{}
>>> lfunc.__annotations__['var1'] = str
>>> lfunc.__annotations__['var2'] = str
>>> lfunc.__annotations__['return'] = int
>>> lfunc.__annotations__
{'var1': <class 'str'>, 'return': <class 'int'>, 'var2': <class 'str'>}
Tất nhiên, không phải các chú thích động như thế này sẽ giúp bạn khi bạn muốn chạy một trình phân tích tĩnh trên các gợi ý loại của mình.