Giới hạn trên trong Python

Hàm range[] trả về tạo ra một dãy số, bắt đầu từ cận dưới đến cận trên


range[lower_bound, upper_bound, step_size]


  • chặn dưới. Giá trị bắt đầu của danh sách

  • giới hạn trên. Giá trị tối đa của danh sách, không bao gồm số này

  • step_bound. Kích thước bước, sự khác biệt giữa mỗi số trong danh sách


Các tham số Lower_bound và step_size là tùy chọn. Theo mặc định, giới hạn dưới được đặt thành 0, bước tăng dần được đặt thành một. Các tham số phải thuộc loại số nguyên, nhưng có thể là số âm

Hàm phạm vi python trong trình thông dịch

Khóa học liên quan.
Trại đào tạo lập trình Python. Đi từ con số 0 đến người hùng

sự khác biệt trong phạm vi triển khai
Sự khác biệt này thường không phải là vấn đề. Phạm vi [] được triển khai hơi khác trong các phiên bản Python.


  • Trăn 2. x. Hàm range[] trả về một danh sách

  • Trăn 3. x. Hàm range[] tạo ra một chuỗi


phạm vi trong python 2. 7
Một cuộc gọi đến phạm vi [5] sẽ trở lại. 0,1,2,3,4.

>>> range[5]

Một cuộc gọi đến phạm vi [1,10] trả về. 1,2,3,4,5,6,7,8,9


>>> range[1,10]

Phạm vi gọi [0,10,2] trả về. 0,2,4,6,8


>>> range[0,10,2]

dải ô trong python 3
Để tạo danh sách sử dụng dải ô, hãy thêm hàm danh sách


>>> list[range[5]]

Chúng ta có thể sử dụng tất cả các tham số [cận dưới, cận trên, bước]


>>> list[range[0,10,2]]
[0, 2, 4, 6, 8]

triển khai python 2
Phiên bản này của phạm vi [] phân bổ bộ nhớ máy tính và cũng điền vào bộ nhớ máy tính đằng sau hậu trường. Đối với phạm vi lớn, việc triển khai này không hiệu quả lắm.

Thông thường, bạn sẽ không gặp bất kỳ vấn đề nào với việc triển khai phạm vi [] trong Python2 nhưng nếu bạn sử dụng số lượng lớn [hàng triệu mục], bạn có thể gặp sự cố

Các ràng buộc về phiên bản giới hạn [viết hoa trên] đang bắt đầu xuất hiện trong hệ sinh thái Python. Điều này đang gây ra các vấn đề trong thế giới thực với các thư viện tuân theo đề xuất này và có khả năng; . Trong cuộc thảo luận này, tôi muốn giải thích lý do tại sao việc luôn cung cấp giới hạn trên lại gây hại nhiều hơn là có lợi ngay cả đối với các thư viện SemVer thực sự, tại sao các thư viện xác định giới hạn trên lại yêu cầu cập nhật thường xuyên hơn thay vì ít hơn và tại sao nó không thể mở rộng. Sau khi đọc phần này, hy vọng bạn sẽ luôn cân nhắc mọi giới hạn bạn thêm vào, bạn sẽ biết [một vài] vị trí mà việc ghim giới hạn trên là hợp lý và thậm chí có thể tránh sử dụng các thư viện ghim giới hạn trên một cách không cần thiết cho đến khi tác giả cập nhật chúng để loại bỏ những giới hạn này

Nếu con số khổng lồ 10.000 từ này hơi dài đối với bạn, thì hãy bỏ qua việc sử dụng mục lục hoặc xem phần ở cuối hoặc đọc số phiên bản của Bernát Gábor, ngắn hơn nhưng là một bài đọc tuyệt vời với các ví dụ hay và dễ thương . Hoặc phiên bản ngữ nghĩa của Hynek sẽ không cứu bạn Hãy chắc chắn kiểm tra ít nhất trước khi bạn rời đi

Cũng được cảnh báo, tôi chọn Thơ khá nhiều. Sự phổ biến ngày càng tăng của Thơ có thể là do sự đơn giản của việc có một công cụ so với. nhiều thứ để đóng gói, nhưng nó cũng có một bộ giải phụ thuộc đặc biệt, một cú pháp giới hạn trên mới và một - đối lập trực tiếp với các thành viên của nhóm nhà phát triển cốt lõi Python và các nhà phát triển PyPA. Không phải tất cả các thư viện có giới hạn phiên bản quá mức đều là các dự án Thơ [như TensorFlow], nhưng rất nhiều trong số đó là. Nói rõ hơn, Poetry không ép buộc bạn phải ghim phiên bản, nhưng nó thúc đẩy bạn thực sự, rất khó để luôn giới hạn phiên bản và nó nhắm mục tiêu đến những người dùng Python mới chưa biết cách nào tốt hơn là chấp nhận các đề xuất tồi. Và những điều này ảnh hưởng đến toàn bộ hệ sinh thái, bao gồm cả những người dùng không sử dụng thơ, nhưng muốn phụ thuộc vào các thư viện sử dụng. Tôi thực sự thích các khía cạnh khác của Thơ và cuối cùng muốn giúp nó xây dựng các gói nhị phân với Scikit-build [CMake] thông qua một plugin và tôi vui vẻ sử dụng nó trong một số dự án của mình. Nếu tôi không chọn đủ Thơ cho bạn, đừng lo lắng, tôi có một bài đăng tiếp theo sẽ chọn nó chi tiết hơn nhiều. Ngoài ra, hãy xem pdm, mang lại nhiều lợi ích của Thơ khi tuân theo các tiêu chuẩn PEP

Điều này hóa ra khá dài [và thậm chí còn lâu hơn sau khi được các nhà phát triển cốt lõi của PyPA và Python đánh giá], vì vậy tôi đã bao gồm một mục lục. Thoải mái chuyển sang nội dung mà bạn quan tâm. Điều này cũng được chia thành ba bài viết, đầu tiên là ứng dụng so với. thư viện, và cuối cùng là phiên bản Thơ

Mục lục [bấm vào để mở rộng]
giới thiệu

Giới hạn phiên bản là gì?

click>=7

bạn viết cái này

click>=7,=7,=7,=7,=7,=7,3 là một thảm họa. Những người theo chủ nghĩa thuần túy SemVer lập luận rằng điều này biến các bản phát hành nhỏ thành bản phát hành chính, nhưng nó không đơn giản như vậy - thời gian ngừng sử dụng đảm bảo phiên bản “tiếp theo” hoạt động, điều này thực sự hữu ích và thường cho bạn thời gian để điều chỉnh trước khi quá trình xóa xảy ra. Đó là một sự cân bằng tuyệt vời cho các dự án được duy trì tốt bằng cách sử dụng các thư viện phát triển với tốc độ hợp lý. Nếu bạn chắc chắn rằng bạn có thể thấy các phiên bản không dùng nữa, thì hầu như bạn sẽ luôn làm việc với một số phiên bản tiếp theo

Để tránh sự nhầm lẫn có thể xảy ra trong tương lai, một số thư viện do dự về việc phát hành các phiên bản chính mới [như Python, NumPy và CMake] đến mức họ thực hiện các thay đổi đột phá [như xóa các tính năng không dùng nữa] trên các bản phát hành nhỏ, giúp thúc đẩy các phiên bản phụ lên các phiên bản chính theo . Đây là kỳ vọng xã hội trong hệ sinh thái và là một lý do khiến một số thư viện sử dụng CalVer

Mô tả tốt nhất về SemVer thực tế mà tôi từng thấy là nó là một “bản ghi thay đổi viết tắt”. Tôi thích điều này, vì tôi thích nhật ký thay đổi - tôi nghĩ đó là phần quan trọng nhất trong tài liệu mà bạn có, nhật ký thay đổi được viết tốt cho phép bạn xem những gì đã bị thiếu trước đây để bạn biết không tìm kiếm nó trong các phiên bản cũ hơn, nó cho bạn biết những gì . Với SemVer, bạn có thể xem phiên bản và điều đó cho bạn ý tưởng nhanh về mức độ lớn và loại thay đổi nào đã xảy ra trước khi kiểm tra nhật ký thay đổi

Người giải quyết

Chúng ta cần đề cập ngắn gọn về bộ giải, vì có một số bộ giải và một lý do khiến điều này ngày nay phù hợp hơn so với vài năm trước là do những thay đổi trong bộ giải

Bộ giải Pip đã thay đổi trong phiên bản 20. 3 để trở nên thông minh hơn đáng kể. Bộ giải cũ sẽ bỏ qua các yêu cầu bắc cầu không tương thích thường xuyên hơn nhiều so với bộ giải mới. Điều này có nghĩa là giới hạn trên trong thư viện có thể đã bị bỏ qua trước đó, nhưng có nhiều khả năng làm hỏng mọi thứ hoặc thay đổi lời giải ngay bây giờ

Nó cố gắng tìm một tập hợp các phụ thuộc đang hoạt động mà tất cả đều đồng ý với nhau. Bằng cách nhìn ngược thời gian, thật vui khi giải quyết các phiên bản gói rất cũ nếu các gói mới hơn được cho là không tương thích. Điều này có thể hữu ích, nhưng chậm và cũng có nghĩa là bạn có thể dễ dàng nhận được một bộ gói rất cũ khi bạn nghĩ rằng mình đang nhận được các phiên bản mới nhất

Thơ có một bộ giải độc đáo và rất nghiêm ngặt [và chậm hơn], thậm chí còn đi xa hơn để tìm kiếm các giải pháp. Nó buộc bạn phải giới hạn Python nếu một phụ thuộc không. Một điểm khác biệt chính là Thơ có đặc tả môi trường ban đầu để hoạt động mọi lúc, trong khi pip không biết các ràng buộc môi trường ban đầu là gì. Điều này cho phép Thơ khôi phục sự phụ thuộc vào giải pháp tiếp theo, trong khi pip không biết các yêu cầu ban đầu là gì và do đó không biết liệu gói cũ có hợp lệ khi gặp giới hạn mới hay không

Trình giải quyết của Conda giống như Thơ và do số lượng bản dựng trong các kênh conda, điều này sẽ khiến bạn sợ hãi - việc giải quyết ban đầu cho một môi trường có số lượng lớn các thành phần phụ thuộc [bao gồm một gói duy nhất như ROOT] có thể mất vài phút và các bản cập nhật cho các môi trường hiện có . Tôi chưa bao giờ làm Thơ mất hơn 70 giây, nhưng tôi cũng chưa sử dụng nó cho bất kỳ thứ gì lớn; . Conda đã trở nên tốt hơn bằng cách sử dụng nhiều phím tắt hơn và đoán mọi thứ [tôi đã không giải quyết được hơn 25 giờ trong một thời gian], và việc triển khai C của Mamba và các thuật toán tốt hơn thực sự hữu ích, nhưng thực hiện một giải pháp “thông minh” thì khó

Chúng ta sẽ thấy nó một lần nữa, nhưng chỉ để chỉ ra nó ở đây. lỗi bộ giải hoàn toàn là lỗi và không thể sửa được ở hạ lưu. Nếu một thư viện yêu cầu


>>> range[5]

10 và một thư viện khác yêu cầu

>>> range[5]

11, thế là xong, bạn ngừng kinh doanh. Bộ giải “thông minh” có thể tìm kiếm các phiên bản cũ hơn của các thư viện đó để xem liệu có tồn tại phiên bản nào không có giới hạn đó hay không - nếu phiên bản có giới hạn dưới cao có bản phát hành có giới hạn trên dưới, thì đó là những gì nó sẽ chọn; . kể từ khi phát hành. Chúng ta sẽ thảo luận về những vấn đề này gây ra sau. Tuy nhiên, một bản dựng không bị ràng buộc là hoàn toàn tầm thường để khắc phục đối với bất kỳ người dùng nào. Đó chỉ là một sự bất tiện nhỏ đối với một số lượng lớn người dùng

Vấn đề. Dựa vào SemVer để giới hạn các phiên bản

Bây giờ đến vấn đề. Nếu bạn có một phụ thuộc, bạn có nên thêm một giới hạn trên không? . Đảm bảo rằng bạn hiểu sự khác biệt giữa thư viện và ứng dụng, như đã định nghĩa trong bài viết trước

Chúng tôi sẽ đề cập đến các trường hợp sử dụng hợp lệ để giới hạn sau phần này. Tuy nhiên, để rõ ràng, nếu bạn biết bạn không hỗ trợ một bản phát hành mới của thư viện, thì tuyệt đối, hãy tiếp tục và giới hạn nó ngay khi bạn biết điều này là đúng. Nếu một cái gì đó không hoạt động, bạn nên giới hạn [hoặc có thể hạn chế một phiên bản nếu thư viện ngược dòng có lỗi tạm thời thay vì hướng thiết kế gây ra lỗi]. Bạn cũng nên làm nhiều nhất có thể để nhanh chóng gỡ bỏ giới hạn, vì tất cả các nhược điểm của giới hạn trong các phần tiếp theo vẫn được áp dụng

Những điều sau đây sẽ cho rằng bạn đang giới hạn trước khi biết rằng một cái gì đó không hoạt động, nhưng chỉ nằm ngoài nguyên tắc chung, như Thơ khuyến nghị và mặc định với


>>> range[5]

12 và mẫu mặc định. Trong hầu hết các trường hợp, câu trả lời sẽ là “không”. Để đơn giản, tôi cũng sẽ cho rằng bạn đang muốn giới hạn các bản phát hành chính [

>>> range[5]

13 trong Thơ hoặc

>>> range[5]

14 trong tất cả các công cụ khác tuân theo tiêu chuẩn Python thông qua PEP 440]. Nếu bạn giới hạn ở các phiên bản phụ [

>>> range[5]

15], điều này còn tồi tệ hơn nhiều và các lập luận bên dưới thậm chí còn áp dụng mạnh mẽ hơn

Phiên bản cũng giới hạn mã phá vỡ

Thư viện. ✅ [áp dụng]

Đăng kí. ✳️ [áp dụng một phần]

Không ai thích có một người dùng phá vỡ cập nhật. Ví dụ: IPython phụ thuộc vào thư viện có tên là Jedi. hiệp sĩ 0. 18 đã xóa thứ mà IPython đã sử dụng, vì vậy cho đến IPython 7. 20 đã được phát hành, một giải pháp "bình thường" [như


>>> range[5]

16] dẫn đến cài đặt bị hỏng. Thật hấp dẫn khi nhìn lại điều đó và nói "tốt, nếu IPython giới hạn các phụ thuộc của nó, thì điều đó đã có thể tránh được". Trên thực tế, mỗi khi điều này xảy ra, bạn sẽ thấy những đề xuất có ý nghĩa tốt nhưng sai lầm cho rằng đây là bằng chứng cho thấy lẽ ra bạn nên chọn giới hạn trên hợp lý cho tất cả các yêu cầu

Tuy nhiên, giới hạn các phụ thuộc cũng làm hỏng mọi thứ và bạn không thể sửa nó ở hạ lưu. Nếu tôi viết một thư viện hoặc ứng dụng phụ thuộc vào thư viện có phần phụ thuộc bị hỏng, tôi có thể giới hạn nó và sau đó người dùng của tôi hài lòng. Trong trường hợp trên, giải pháp tạm thời là chỉ ghim Jedi theo cách thủ công, chẳng hạn như


>>> range[5]

17 cho người dùng hoặc giới hạn nó trong phần phụ thuộc cho thư viện hoặc ứng dụng. Bất kỳ người dùng nào cũng có thể dễ dàng làm điều đó - khó chịu và trừu tượng bị rò rỉ, nhưng có thể sửa được. Nhưng bạn không thể khắc phục một ràng buộc quá mức - và đây không chỉ là vấn đề về pip; . Hầu hết các bản phát hành khác của Jedi đều ổn, việc giới hạn các phiên bản khác sẽ gây ra vấn đề đối với những người dùng không quan tâm hoặc biết về IPython khi sử dụng Jedi

Thực sự có một giải pháp cho vấn đề này bên ngoài các gói PyPI/pip; . Conda hỗ trợ điều này một cách tự nhiên;

Nếu bạn đặt giới hạn trên, điều này cũng không thể dễ dàng khắc phục bởi các phụ thuộc của bạn - nó thường buộc sửa lỗi trên thư viện thực hiện ghim. Điều này có nghĩa là mọi bản phát hành chính của mọi phần phụ thuộc mà bạn giới hạn ngay lập tức yêu cầu bạn tạo một bản phát hành mới hoặc mọi người sử dụng thư viện của bạn không thể sử dụng phiên bản mới nhất của các thư viện đó nữa. Nếu "tạo bản phát hành mới nhanh chóng" ở trên làm phiền bạn;

Điều đó cũng có nghĩa là bạn phải hỗ trợ nhiều phiên bản khác nhau; . Ví dụ: giả sử bạn ủng hộ


>>> range[5]

18. Nhấp chuột 8 xuất hiện và ai đó viết thư viện yêu cầu

>>> range[5]

19. Bây giờ thư viện của bạn không thể được cài đặt cùng lúc với thư viện khác, yêu cầu của bạn không trùng lặp. Nếu bạn cập nhật lên yêu cầu

>>> range[1,10]

80, thì bản cập nhật của bạn không thể được cài đặt với một thư viện khác vẫn còn trên

>>> range[5]

18. Vì vậy, bạn phải hỗ trợ

>>> range[1,10]

82 trong một thời gian cho đến khi hầu hết các thư viện được cập nhật tương tự [và điều này làm cho cú pháp

>>> range[1,10]

83 khá vô dụng, IMO]. Ví dụ cụ thể này đặc biệt tệ, bởi vì a] nó phổ biến, b] nhấp chuột được sử dụng cho phần "ứng dụng" của mã, phần này thậm chí có thể không được sử dụng nếu bạn đang sử dụng nó làm thư viện và c]

Thư viện yêu cầu can thiệp phiên bản thủ công không bị hỏng, nó chỉ gây khó chịu. Thư viện không thể cài đặt do xung đột phiên bản bị hỏng. Nếu xung đột phiên bản đó là giả, thì bạn đã tạo ra một vấn đề không thể giải quyết được trong đó không tồn tại

Các bản sửa lỗi không phải lúc nào cũng được nhập lại

Thư viện. ✅ [áp dụng]

Đăng kí. ✅ [áp dụng]

Tôi sẽ chuyển sang bài đăng của Bernát để giải thích rằng nhiều dự án Python đơn giản là không có thời gian hoặc tài nguyên để tiếp tục cung cấp các bản sửa lỗi và bản vá bảo mật cho các phiên bản chính cũ. Tôi đã từng bị các dự án như pip và pandas từ chối yêu cầu cập nhật bản vá lỗi cũ. Trên thực tế, tôi thậm chí đã từ chối họ cho CLI11, CI của tôi đã bị hỏng trên 1 cái cũ. x nên tôi không thể chạy thử nghiệm

Hãy xem xét một ví dụ cụ thể. Giả sử một số thư viện phiên bản 6. 1. 0 đã hoạt động. Bạn ghim vào


>>> range[1,10]

85. Sau đó,

>>> range[1,10]

86 xuất hiện và phá mã của bạn. Sự cố đã được phát hiện và khắc phục, nhưng quá trình phát triển đã đi quá xa để có thể dễ dàng sao lưu hoặc quá phức tạp nên

>>> range[1,10]

87 hoạt động trở lại. Giới hạn của bạn hiện đã bị hỏng và mã của bạn không hoạt động mãi mãi [phần tiếp theo]. Tôi đã thấy các bản sửa lỗi như thế này nhiều lần và cũng chịu trách nhiệm cho chúng. Thường thì hệ thống CI bị hỏng đối với các bản phát hành cũ, không rõ ràng và việc quay lại và sửa phiên bản cũ là không khả thi

Phiên bản mã mới hơn nhằm mục đích tốt hơn các phiên bản mã cũ hơn; . Bạn không bao giờ nên hạn chế khả năng cập nhật những thứ mà bạn phụ thuộc vào của người dùng [các phụ thuộc không nên là một bản tóm tắt dễ bị rò rỉ; người dùng không cần phải biết hoặc quan tâm đến những gì bạn phụ thuộc vào]. Giới hạn trên hạn chế đáng kể khả năng cập nhật mà người dùng cuối không biết

Bạn muốn người dùng sử dụng các phiên bản mới nhất của mã của bạn. Bạn muốn có thể phát hành các bản sửa lỗi và yêu cầu người dùng nhận các bản sửa lỗi đó. Và, nói chung, bạn không muốn phải phát hành các phiên bản vá lỗi mới cho các phiên bản chính cũ [hoặc thậm chí là phụ] trong thư viện của mình, ít nhất là từ rất xa. Vậy tại sao lại buộc các phần phụ thuộc của bạn hỗ trợ các phiên bản cũ với các bản phát hành bản vá vì bạn đã giới hạn chúng?

Mã không hoạt động mãi mãi

Thư viện. ✅ [áp dụng]

Đăng kí. ✅ [áp dụng]

Một tuyên bố mà tôi đã thấy các nhà phát triển Thơ đưa ra là việc giới hạn các phụ thuộc của bạn có nghĩa là mã của bạn sẽ hoạt động trong tương lai. Hy vọng rằng tôi không phải nói với bạn điều này là sai; . Có rất nhiều lý do khiến mã bị hỏng mà không thay đổi nó, hãy xem xét một vài lý do

Một trong những cái gần đây nhất là quá trình chuyển đổi macOS Apple Silicon. Để có được mã làm việc, bạn phải có các phiên bản gói mới nhất. Trăn 3. 9 [và sau đó được nhập vào 3. 8] được yêu cầu trên Apple Silicon, vì vậy nếu bạn phụ thuộc vào thư viện giới hạn không hỗ trợ các phiên bản đó, thì bạn không gặp may, mã đó không hoạt động. Điều này cũng đúng với tất cả các thư viện lớn không hỗ trợ Apple Silicon quá xa. Bạn cần một NumPy, pip, bao bì, Thơ gần đây, v.v. Và đề phòng trường hợp bạn nghĩ rằng mình có nhiều thời gian, hãy lưu ý rằng Apple thậm chí không còn bán máy tính xách tay dựa trên Intel nữa, đúng một năm sau khi quá trình chuyển đổi bắt đầu

Các đợt triển khai hỗ trợ tương tự đã xảy ra [hoặc đang diễn ra] cho các kiến ​​trúc Linux và Windows [như ARM và PowerPC], các bản cập nhật hệ điều hành [hệ thống đánh số mới của macOS 11 đã phá vỡ pip, Thơ và nhiều thứ khác, cũng có thể xảy ra ở mức độ thấp hơn trên . Đơn giản là mã sẽ không bao giờ hoạt động mãi mãi và việc cho phép khả năng sử dụng các thư viện mới hơn sẽ tăng cơ hội sử dụng nó. Nếu bạn giới hạn NumPy ở mức 1. 17, bạn sẽ không bao giờ ủng hộ Apple Silicon. Tuy nhiên, nếu bạn không giới hạn nó và phiên bản cuối cùng mà bạn thực sự hỗ trợ sẽ là 1. 21, thì mã của bạn sẽ hoạt động với Apple Silicon và những người dùng trong tương lai có thể phải giới hạn các phiên bản theo cách thủ công ở mức =7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7,=7

2

Điều này sẽ buộc

click>=7,=7,=7,=7,=7
22] ngoại trừ nắp này. Điều này ngay lập tức bắt đầu phá vỡ mọi thứ [như triển khai Google App Engine và các khiếu nại khác nêu rõ “rất nhiều xung đột phụ thuộc”]. Rõ ràng, nó không giải quyết được bất cứ điều gì ngoại trừ một bài kiểm tra bên trong chính bao bì. Sau đó pyparsing 3. 0. 5 đã được phát hành với sự thay đổi tên phương thức nội bộ [bắt đầu bằng dấu gạch dưới]. Điều này đã được sử dụng bởi bao bì [xấu], vì vậy giới hạn thực sự là
click>=7,=7
24, mặc dù họ có thể nói rằng đó là lỗi của bao bì - đúng vậy]. Cách khắc phục chính xác là không sử dụng chi tiết triển khai riêng, bao bì đã được sửa, nhưng các phiên bản cũ vẫn tồn tại

TL;DR

Giới hạn phụ thuộc có tác động tiêu cực lâu dài, đặc biệt là đối với các thư viện và không bao giờ được xem nhẹ. Thư viện không được cài đặt riêng lẻ; . Chỉ thêm giới hạn nếu phần phụ thuộc được biết là không tương thích hoặc có khả năng cao [>75%] phần phụ thuộc không tương thích trong bản phát hành tiếp theo. Không giới hạn theo mặc định - giới hạn phụ thuộc làm cho phần mềm của bạn không tương thích với các thư viện khác cũng có giới hạn thấp hơn nghiêm ngặt đối với phụ thuộc và giới hạn các bản sửa lỗi trong tương lai. Bất kỳ ai cũng có thể sửa giới hạn bị thiếu, nhưng người dùng không thể sửa giới hạn quá hạn chế gây ra lỗi bộ giải. Nó cũng khuyến khích ẩn các vấn đề cho đến khi chúng trở nên khó sửa chữa hơn, nó không mở rộng sang các hệ thống lớn hơn, nó hạn chế khả năng truy cập các bản cập nhật bảo mật và sửa lỗi của bạn và một số công cụ [Poetry] buộc những người dùng hạ nguồn của bạn phải đưa ra những quyết định tồi tệ này nếu bạn đưa ra chúng. Không bao giờ giới hạn Python, về cơ bản nó đã bị hỏng vào lúc này. Ngoài ra, ngay cả việc đóng nắp bao bì cũng có những hậu quả tiêu cực có thể tạo ra những giải pháp không mong muốn

Ngay cả SemVer hoàn hảo cũng không hứa hẹn việc sử dụng của bạn sẽ bị hỏng và dù sao thì không có thư viện nào thực sự có thể tuân theo SemVer một cách hoàn hảo; . Bạn phải học cách sử dụng hệ thống gói khóa nếu bạn cần độ tin cậy của ứng dụng - Giới hạn SemVer không thể thay thế. Python có văn hóa sử dụng các cảnh báo không dùng nữa và chuyển đổi chậm, không giống như hệ sinh thái có hệ thống phụ thuộc lồng nhau như npm. Chúng tôi đã thấy một dự án NPM thực tế có hơn 30 xung đột phiên bản nếu nó được làm phẳng như Python - giới hạn phiên bản không mở rộng khi chia sẻ các phụ thuộc. Cung cấp một tập hợp các ràng buộc được ghim đầy đủ tùy chọn nếu điều đó quan trọng đối với bạn đối với các ứng dụng - đây là cách duy nhất để đảm bảo một tập hợp phụ thuộc hoạt động lâu dài [bao gồm cả cho npm]

Nếu nhất thiết phải đặt giới hạn trên, bạn nên phát hành phiên bản mới càng sớm càng tốt với giới hạn cao hơn khi phần phụ thuộc cập nhật [lý tưởng là trước khi phần phụ thuộc phát hành bản cập nhật]. Nếu bạn đang cam kết điều này, tại sao không nhanh chóng phát hành một bản phát hành bản vá có giới hạn chỉ sau khi xung đột thực sự xảy ra? . Bạn muốn người dùng sử dụng các phiên bản mới nhất của thư viện nếu có sự cố, vậy tại sao bạn không thể đưa ra sự cân nhắc tương tự cho các thư viện mà bạn phụ thuộc và sử dụng?

Nếu bạn cần TL;DR cho TL;DR, tôi sẽ chỉ trích dẫn Thành viên Hội đồng Chỉ đạo Python và chuyên gia đóng gói Brett Cannon

Các thư viện/gói phải được đặt giới hạn và nếu cần, loại trừ các phiên bản lỗi đã biết, nhưng nếu không thì không giới hạn phiên bản tối đa vì bạn không thể dự đoán khả năng tương thích trong tương lai

Ngoài ra, điều này không thể khái quát hóa đối với các hệ thống có thể cung cấp các phiên bản duy nhất cho từng gói - như Node. js. Các hệ thống này có thể tránh xung đột trình giải quyết bằng cách cung cấp các phiên bản khác nhau cục bộ cho từng gói; . Điều này rất, rất khác với một hệ thống luôn giải quyết cho một phiên bản dùng chung. Những hệ thống đó cũng là nơi cú pháp


>>> range[1,10]

83 hữu ích hơn nhiều. Một số công cụ [như Thơ] dường như đang cố gắng áp dụng một phần của các hệ thống đó [ví dụ: cú pháp dấu mũ] mà không áp dụng tính năng phiên bản cục bộ, đây là chìa khóa cho cách chúng hoạt động. Việc có các bản sao cục bộ [trên mỗi phần phụ thuộc] của tất cả các phần phụ thuộc giải quyết được nhiều vấn đề ở trên và thực tế biến các thư viện thành ứng dụng, mặc dù một số đối số ở trên vẫn được áp dụng, chẳng hạn như ẩn tính không tương thích cho đến khi bộ thay đổi rất lớn

Sự nhìn nhận

Cảm ơn thành viên hội đồng chỉ đạo Python Brett Cannon, nhà phát triển cốt lõi Python Paul Ganssle, các thành viên PyPA Bernát Gábor, Pradyun Gedam và @layday, thành viên RSE Troy Comi và thành viên IRIS-HEP Alex Held vì những nhận xét của họ về các bản nháp ban đầu. Ngoài ra, tôi muốn ghi nhận bài viết xuất sắc Tại sao bạn không nên gọi thiết lập. py trực tiếp từ Paul Ganssle vì đã thuyết phục tôi rằng một bài viết quái dị kiểu Proustian có thể hữu ích. Tất cả lỗi chính tả và lỗi là của riêng tôi

  1. Thơ đang ưu tiên tính trung thực của file khóa đây. Nếu bạn tạo một tệp khóa [và Thơ luôn làm như vậy] và một chân phụ thuộc python

Chủ Đề