Hướng dẫn is python typing enforced? - nhập python có được thực thi không?

Một tùy chọn để tận dụng các gợi ý loại là mô -đun type_enforced. Liên quan đến hỗ trợ Python chính thức, dường như các loại gợi ý sẽ không được thực thi trực tiếp trong tương lai gần.

Đi vào type_enforced, gói cho phép bạn tận dụng các gợi ý loại. Nó hỗ trợ cả đầu vào và nhập đầu ra. Chỉ các loại được chỉ định mới được thực thi. Nhiều đầu vào có thể cũng được hỗ trợ để bạn có thể chỉ định một cái gì đó như int hoặc float.

Các loại đầu vào được xác thực đầu tiên (một cách lười biếng trong cuộc gọi chức năng) và nếu hợp lệ, hàm được xử lý trong đó giá trị trả về sau đó được xác thực.

Có một số hạn chế sao cho các cấu trúc loại lồng nhau không được hỗ trợ. Ví dụ: bạn không thể chỉ định loại dưới dạng danh sách các số nguyên, mà chỉ một danh sách. Bạn sẽ cần xác thực các mục trong danh sách bên trong chức năng của bạn.

pip install type_enforced
>>> import type_enforced
>>> @type_enforced.Enforcer
... def my_fn(a: int , b: [int, str] =2, c: int =3) -> None:
...     pass
...
>>> my_fn(a=1, b=2, c=3)
>>> my_fn(a=1, b='2', c=3)
>>> my_fn(a='a', b=2, c=3)
Traceback (most recent call last):
  File "", line 1, in 
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 47, in __call__
    return self.__validate_types__(*args, **kwargs)
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 83, in __validate_types__
    self.__check_type__(assigned_vars.get(key), value, key)
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 56, in __check_type__
    self.__exception__(
  File "/home/conmak/development/personal/type_enforced/type_enforced/enforcer.py", line 37, in __exception__
    raise Exception(f"({self.__fn__.__qualname__}): {message}")
Exception: (my_fn): Type mismatch for typed function (my_fn) with `a`. Expected one of the following `[]` but got `` instead.

Được đăng bởi 4 năm trước4 years ago4 years ago

Lưu trữ

Hướng dẫn is python typing enforced? - nhập python có được thực thi không?

Gợi ý loại của Python có vẻ khá phổ biến và tôi đang xem xét sử dụng chúng trong dự án tiếp theo của mình. Tuy nhiên, tôi hơi lo lắng về cách mà, mặc dù chúng có thể được kiểm tra một cách tĩnh, chúng bị bỏ qua trong thời gian chạy.

Có ai đã thử sử dụng một thư viện như thực thi để đảm bảo các gợi ý loại vẫn được tôn trọng khi một chương trình đang chạy? Hoặc bạn thường thấy kiểm tra tĩnh là đủ?

Chủ đề này được lưu trữ

Nhận xét mới không thể được đăng và phiếu bầu không thể được chọn

cấp độ 1

Vâng, mọi người đã thử điều này.

  • Khái niệm chung về cơ bản là bạn đang thực hiện gõ tĩnh thông qua "Thiết kế theo hợp đồng". dpcontracts là một thư viện tốt để kiểm tra trước và hậu kỳ tổng quát hơn, nếu bạn quan tâm.

  • Tôi nhớ đã thấy một sự so sánh của bốn thư viện để thực thi loại ở đâu đó trong một cuộc thảo luận GitHub liên quan đến PEP. Nói tóm lại, tất cả đều có lỗi (một số chỉ có lỗi, một lỗi được đánh dấu "không hoàn chỉnh") nhưng quan trọng hơn là khoảng cách hiệu suất ~ 300X (nghĩa là ba mươi nghìn phần trăm) khi xử lý các loại chung như List[int].~300x performance gap (that is, thirty thousand percent) when dealing with generic types like List[int].~300x performance gap (that is, thirty thousand percent) when dealing with generic types like List[int].

Kết quả thông thường là quyết định rằng một trình kiểm tra loại ngoại tuyến (thường là mypy) hoạt động tốt và mâu thuẫn mã của bạn để kiểm tra loại thời gian chạy thường bổ sung nhiều lỗi hơn là ngăn chặn - không nói gì về chi phí lao động và hiệu suất của con người.

Vì vậy, sử dụng các chú thích loại, kiểm tra tĩnh, sau đó di chuyển và chỉ cần thêm dpcontracts hoặc hypothesis hoặc cả hai.

cấp độ 2

Có sẵn máy móc (nhận thức chung) typecheck trong thời gian chạy vẫn hữu ích, tuy nhiên có thể chậm, ví dụ như ở ranh giới thô giữa các hệ thống không được phát hiện và đánh máy và trong các lần chạy thử. Đối với các hệ thống phức tạp, tôi sẽ vui vẻ thanh toán chi phí kiểm tra cho số lượng nhỏ dữ liệu mà các thử nghiệm có xu hướng chạy và để sản xuất chạy không bị thay đổi bởi nó.

cấp độ 1

Vâng, mọi người đã thử điều này.

Khái niệm chung về cơ bản là bạn đang thực hiện gõ tĩnh thông qua "Thiết kế theo hợp đồng". dpcontracts là một thư viện tốt để kiểm tra trước và hậu kỳ tổng quát hơn, nếu bạn quan tâm.

Tôi nhớ đã thấy một sự so sánh của bốn thư viện để thực thi loại ở đâu đó trong một cuộc thảo luận GitHub liên quan đến PEP. Nói tóm lại, tất cả đều có lỗi (một số chỉ có lỗi, một lỗi được đánh dấu "không hoàn chỉnh") nhưng quan trọng hơn là khoảng cách hiệu suất ~ 300X (nghĩa là ba mươi nghìn phần trăm) khi xử lý các loại chung như List[int].~300x performance gap (that is, thirty thousand percent) when dealing with generic types like List[int].

cấp độ 1

Vâng, mọi người đã thử điều này.

cấp độ 2

Có sẵn máy móc (nhận thức chung) typecheck trong thời gian chạy vẫn hữu ích, tuy nhiên có thể chậm, ví dụ như ở ranh giới thô giữa các hệ thống không được phát hiện và đánh máy và trong các lần chạy thử. Đối với các hệ thống phức tạp, tôi sẽ vui vẻ thanh toán chi phí kiểm tra cho số lượng nhỏ dữ liệu mà các thử nghiệm có xu hướng chạy và để sản xuất chạy không bị thay đổi bởi nó.

Tôi nhớ đã thấy một sự so sánh của bốn thư viện để thực thi loại ở đâu đó trong một cuộc thảo luận GitHub liên quan đến PEP. Nói tóm lại, tất cả đều có lỗi (một số chỉ có lỗi, một lỗi được đánh dấu "không hoàn chỉnh") nhưng quan trọng hơn là khoảng cách hiệu suất ~ 300X (nghĩa là ba mươi nghìn phần trăm) khi xử lý các loại chung như List[int].

Cá nhân tôi sử dụng MyPy như một linter rất kén chọn, để đảm bảo rằng tôi đã hiểu về mặt khái niệm và thực hiện các loại một cách hợp lý.

cấp độ 2

Có sẵn máy móc (nhận thức chung) typecheck trong thời gian chạy vẫn hữu ích, tuy nhiên có thể chậm, ví dụ như ở ranh giới thô giữa các hệ thống không được phát hiện và đánh máy và trong các lần chạy thử. Đối với các hệ thống phức tạp, tôi sẽ vui vẻ thanh toán chi phí kiểm tra cho số lượng nhỏ dữ liệu mà các thử nghiệm có xu hướng chạy và để sản xuất chạy không bị thay đổi bởi nó.

Tôi nhớ đã thấy một sự so sánh của bốn thư viện để thực thi loại ở đâu đó trong một cuộc thảo luận GitHub liên quan đến PEP. Nói tóm lại, tất cả đều có lỗi (một số chỉ có lỗi, một lỗi được đánh dấu "không hoàn chỉnh") nhưng quan trọng hơn là khoảng cách hiệu suất ~ 300X (nghĩa là ba mươi nghìn phần trăm) khi xử lý các loại chung như List[int].

Nếu tôi muốn các loại nghiêm ngặt hơn thế, tôi sẽ sử dụng Haskell (mà tôi rất thích!).

Tôi cũng sử dụng rất nhiều mẫu thiết kế Haskell trong Python khi làm việc với các loại (mặc dù don don đi xa như sử dụng bất kỳ thư viện cụ thể nào cho các yếu tố lý thuyết thể loại Haskell).

cấp độ 2

Nếu tôi muốn các loại nghiêm ngặt hơn thế, tôi sẽ sử dụng Haskell (mà tôi rất thích!).

Tôi cũng sử dụng rất nhiều mẫu thiết kế Haskell trong Python khi làm việc với các loại (mặc dù don don đi xa như sử dụng bất kỳ thư viện cụ thể nào cho các yếu tố lý thuyết thể loại Haskell).

cấp độ 2

Các gợi ý loại có được thi hành không?They are not enforced at build or run time in any way by Python. Instead used by type checkers / linters (like mypy or pyright) and IDEs.

Những điều quan trọng cần lưu ý về các gợi ý loại: chúng không được thi hành tại Build hoặc Run Time theo bất kỳ cách nào bởi Python.Thay vào đó được sử dụng bởi người kiểm tra loại / linters (như mypy hoặc pyright) và ides.They are not enforced at build or run time in any way by Python. Instead used by type checkers / linters (like mypy or pyright) and IDEs.

Python có làm cho gợi ý nhanh hơn không?. They are just for the developer's reference and help auto-completion software. They allow IDEs to recognise data types and give suggestions based on this information.

Không, gõ gợi ý không buộc Python phải kiểm tra loại dữ liệu được lưu trữ trong một biến.Chúng chỉ dành cho tài liệu tham khảo của nhà phát triển và giúp tự động hoàn thành phần mềm.Chúng cho phép IDE nhận ra các loại dữ liệu và đưa ra đề xuất dựa trên thông tin này.. They are just for the developer's reference and help auto-completion software. They allow IDEs to recognise data types and give suggestions based on this information.

Loại Python là gì?a formal solution to statically indicate the type of a value within your Python code. It was specified in PEP 484 and introduced in Python 3.5.

Loại gợi ý là một giải pháp chính thức để chỉ ra định nghĩa loại giá trị trong mã Python của bạn.Nó được chỉ định trong PEP 484 và được giới thiệu trong Python 3.5.a formal solution to statically indicate the type of a value within your Python code. It was specified in PEP 484 and introduced in Python 3.5.

Làm thế nào để Python suy ra các loại?Python allows a symbol to be bound to different values at runtime, so its type can change over time. A symbol's type doesn't need to be declared statically.