Thứ tự các chức năng có quan trọng với python không?
Cú pháp **kwargs trong định nghĩa hàm chỉ ra rằng trình thông dịch sẽ thu thập tất cả các đối số từ khóa không tương ứng với các tham số được đặt tên khác. Tuy nhiên, Python không giữ nguyên thứ tự mà các đối số từ khóa được thu thập đó được chuyển đến hàm. Trong một số bối cảnh, thứ tự quan trọng. PEP này chỉ ra rằng các đối số từ khóa đã thu thập được hiển thị trong thân hàm dưới dạng ánh xạ có thứ tự Show
Động lựcCú pháp **kwargs của Python trong định nghĩa hàm cung cấp một phương tiện mạnh mẽ để xử lý động các đối số từ khóa. Trong một số ứng dụng của cú pháp (xem Trường hợp sử dụng ), ngữ nghĩa được áp dụng cho các đối số từ khóa đã thu thập yêu cầu phải giữ nguyên thứ tự. Không có gì đáng ngạc nhiên, điều này tương tự như cách OrderedDict liên quan đến dict. Hiện tại, để giữ nguyên thứ tự, bạn phải thực hiện thủ công và tách biệt khỏi lệnh gọi chức năng thực tế. Điều này liên quan đến việc xây dựng một ánh xạ có thứ tự, cho dù là OrderedDict hay có thể lặp lại gồm 2 bộ, sau đó được chuyển dưới dạng một đối số cho hàm. [1] Với khả năng được mô tả trong PEP này, bản soạn sẵn đó sẽ không còn cần thiết nữa Để so sánh, hiện tại kwargs = OrderedDict() kwargs['eggs'] = ... ... def spam(a, kwargs): ... và với đề xuất này def spam(a, **kwargs): ... Nick Coglan, khi nói về một số trường hợp sử dụng, đã tóm tắt rất hay [2] These *can* all be done today, but *not* by using keyword arguments. In my view, the problem to be addressed is that keyword arguments *look* like they should work for these cases, because they have a definite order in the source code. The only reason they don't work is because the interpreter throws that ordering information away. It's a textbook case of a language feature becoming an attractive nuisance in some circumstances: the simple and obvious solution for the above use cases *doesn't actually work* for reasons that aren't obviously clear if you don't have a firm grasp of Python's admittedly complicated argument handling. Quan sát này được hỗ trợ bởi sự xuất hiện của đề xuất này trong nhiều năm và nhiều lần mọi người đã bị nhầm lẫn bởi hàm tạo cho OrderedDict. [3] [4] [5] Trường hợp sử dụngNhư Nick đã lưu ý, hành vi hiện tại của **kwargs là không trực quan trong trường hợp người ta cho rằng trật tự là quan trọng. Ngoài các trường hợp cụ thể hơn được nêu bên dưới, nói chung “bất kỳ điều gì khác mà bạn muốn kiểm soát thứ tự lặp lại cũng như đặt tên và giá trị trường trong một lệnh gọi sẽ có khả năng mang lại lợi ích. ” [6] Điều đó quan trọng trong trường hợp của các nhà máy (e. g. __init__()) cho các loại được đặt hàng Tuần tự hóaRõ ràng OrderedDict sẽ có lợi (cả __init__() và update()) từ kwargs đã đặt hàng. Tuy nhiên, lợi ích cũng mở rộng đến các API tuần tự hóa [2] In the context of serialisation, one key lesson we have learned is that arbitrary ordering is a problem when you want to minimise spurious diffs, and sorting isn't a simple solution. Tools like doctest don't tolerate spurious diffs at all, but are often amenable to a sorting based answer. The cases where it would be highly desirable to be able use keyword arguments to control the order of display of a collection of key value pairs are ones like: * printing out key:value pairs in CLI output * mapping semantic names to column order in a CSV * serialising attributes and elements in particular orders in XML * serialising map keys in particular orders in human readable formats like JSON and YAML (particularly when they're going to be placed under source control) gỡ lỗiTheo lời của Raymond Hettinger [7] It makes it easier to debug if the arguments show-up in the order they were created. AFAICT, no purpose is served by scrambling them. Các trường hợp sử dụng khác
mối quan tâmMàn biểu diễnNhư đã lưu ý, ý tưởng về các đối số từ khóa được sắp xếp đã xuất hiện trong một số trường hợp. Mỗi lần nó được đáp ứng với cùng một phản hồi, cụ thể là việc duy trì thứ tự từ khóa arg sẽ có tác động đủ bất lợi đến hiệu suất lệnh gọi hàm mà nó không đáng làm. Tuy nhiên, Guido lưu ý những điều sau đây [9] Making **kwds ordered is still open, but requires careful design and implementation to avoid slowing down function calls that don't benefit. Như sẽ được lưu ý bên dưới, có nhiều cách để giải quyết vấn đề này với chi phí là sự phức tạp gia tăng. Cuối cùng, cách tiếp cận đơn giản nhất là cách có ý nghĩa nhất. đóng gói các đối số từ khóa đã thu thập vào một OrderedDict. Tuy nhiên, nếu không có triển khai C của OrderedDict thì không có nhiều điều để thảo luận. Điều đó đã thay đổi trong Python 3. 5. [10] Ghi chú. trong Python 3. 6 dict là giữ trật tự. Điều này hầu như loại bỏ những lo ngại về hiệu suất Các triển khai Python khácMột vấn đề quan trọng khác cần xem xét là các tính năng mới phải phù hợp với nhiều triển khai Python. Tại một thời điểm nào đó, mỗi người trong số họ sẽ thực hiện các lệnh kwarg. Về vấn đề này, dường như không có vấn đề gì với ý tưởng. [11] Một cuộc khảo sát không chính thức về các triển khai Python chính đã chỉ ra rằng tính năng này sẽ không phải là gánh nặng đáng kể Sự chỉ rõBắt đầu từ phiên bản 3. 6 Python sẽ giữ nguyên thứ tự của các đối số từ khóa khi được truyền cho một hàm. Để thực hiện điều này, kwargs được thu thập giờ đây sẽ là một ánh xạ có thứ tự. Lưu ý rằng điều này không nhất thiết có nghĩa là OrderedDict. chính tả trong Python 3. 6 hiện đã được đặt hàng, tương tự như PyPy Điều này sẽ chỉ áp dụng cho các chức năng mà định nghĩa sử dụng cú pháp **kwargs để thu thập các đối số từ khóa không xác định. Chỉ thứ tự của các đối số từ khóa đó sẽ được giữ nguyên Mối quan hệ với cú pháp **-unpackingCú pháp giải nén ** trong các lệnh gọi hàm không có mối liên hệ đặc biệt nào với đề xuất này. Các đối số từ khóa do giải nén cung cấp sẽ được xử lý theo cách chính xác như hiện tại. những tham số phù hợp với các tham số đã xác định sẽ được tập hợp ở đó và phần còn lại sẽ được thu thập vào các kwarg được sắp xếp theo thứ tự (giống như bất kỳ đối số từ khóa chưa từng có nào khác) Lưu ý rằng việc giải nén ánh xạ có thứ tự không xác định, chẳng hạn như dict, sẽ giữ nguyên thứ tự lặp lại của nó như bình thường. Chỉ là thứ tự sẽ không được xác định. Ánh xạ theo thứ tự mà sau đó các cặp khóa-giá trị đã giải nén sẽ được đóng gói vào đó sẽ không thể cung cấp bất kỳ thứ tự thay thế nào. Điều này không có gì đáng ngạc nhiên Đã có những cuộc thảo luận ngắn về việc chỉ cần chuyển các ánh xạ này tới các hàm kwargs mà không cần giải nén và đóng gói lại chúng, nhưng điều đó nằm ngoài phạm vi của đề xuất này và có lẽ là một ý tưởng tồi bất kể. (Có một lý do khiến những cuộc thảo luận đó ngắn gọn. ) Mối quan hệ kiểm tra. Chữ kýĐối tượng chữ ký không cần thay đổi. Tham số kwargs của kiểm tra. BoundArguments (được trả về bởi Chữ ký. liên kết () và Chữ ký. bind_partial()) sẽ thay đổi từ dict thành OrderedDict C-APIKhông thay đổi cú phápKhông có cú pháp nào được thêm hoặc thay đổi bởi đề xuất này Tương thích ngượcSau đây sẽ thay đổi
Thực hiện tham khảoĐối với CPython, không có gì để làm Phương pháp thay thếTrang trí từ chốiĐiều này giống hệt với đề xuất hiện tại với ngoại lệ là Python cũng sẽ cung cấp một trình trang trí trong functools sẽ khiến các đối số từ khóa đã thu thập được đóng gói vào một lệnh bình thường thay vì một OrderedDict tiên lượng Điều này sẽ chỉ cần thiết nếu hiệu suất được xác định là khác biệt đáng kể trong một số trường hợp không phổ biến hoặc có những lo ngại khác về khả năng tương thích ngược mà không thể giải quyết bằng cách khác Trang trí chọn tham giaHiện trạng sẽ không thay đổi. Thay vào đó, Python sẽ cung cấp một trình trang trí trong funcools sẽ đăng ký hoặc đánh dấu hàm được trang trí là một hàm sẽ nhận các đối số từ khóa được sắp xếp. Chi phí hoạt động để kiểm tra chức năng tại thời điểm gọi sẽ là cận biên tiên lượng Mặt trái thực sự duy nhất là trong trường hợp các nhà máy sản xuất hàm bao hàm (e. g. công cụ chức năng. một phần và nhiều bộ trang trí) nhằm mục đích duy trì hoàn hảo các đối số từ khóa bằng cách sử dụng kwargs trong định nghĩa trình bao bọc và giải nén kwargs trong lệnh gọi hàm được bao bọc. Mỗi trình bao bọc sẽ phải được cập nhật riêng, mặc dù có funcools. wraps() làm điều này tự động sẽ giúp __kworder__Thứ tự của các đối số từ khóa sẽ được lưu trữ riêng trong một danh sách tại thời điểm gọi. Danh sách sẽ được liên kết với __kworder__ trong hàm local tiên lượng Điều này cũng làm phức tạp trường hợp trình bao bọc Chính tả nhỏ gọn với phép lặp nhanh hơnRaymond Hettinger đã đưa ra ý tưởng về việc triển khai chính tả sẽ dẫn đến việc duy trì thứ tự chèn trên các ký tự (cho đến lần xóa đầu tiên). Đây sẽ là một sự phù hợp hoàn hảo cho kwargs. [5] tiên lượng Ý tưởng vẫn chưa chắc chắn về cả khả năng tồn tại và khung thời gian Lưu ý rằng Python 3. 6 hiện có triển khai chính tả này *** kwargsĐiều này sẽ thêm một biểu mẫu mới vào chữ ký của hàm dưới dạng song song loại trừ lẫn nhau với **kwargs. Cú pháp mới, ***kwargs (lưu ý rằng có ba dấu hoa thị), sẽ chỉ ra rằng kwargs sẽ giữ nguyên thứ tự của các đối số từ khóa tiên lượng Cú pháp mới chỉ được thêm vào Python trong những trường hợp nghiêm trọng nhất. Với các giải pháp khả dụng khác, cú pháp mới không chính đáng. Hơn nữa, giống như tất cả các giải pháp chọn tham gia, cú pháp mới sẽ làm phức tạp trường hợp chuyển qua chú thíchĐây là một biến thể của phương pháp trang trí. Thay vì sử dụng một công cụ trang trí để đánh dấu chức năng, bạn sẽ sử dụng chú thích chức năng trên **kwargs tiên lượng Ngoài biến chứng chuyển qua, các chú thích đã không được khuyến khích tích cực trong quá trình phát triển cốt lõi của Python. Việc sử dụng các chú thích để chọn tham gia bảo quản đơn đặt hàng có nguy cơ cản trở việc sử dụng các chú thích ở cấp ứng dụng khác mệnh lệnh. __gọi món__các đối tượng dict sẽ có một thuộc tính mới, __order__ sẽ mặc định là Không có và trong trường hợp kwargs, trình thông dịch sẽ sử dụng theo cách tương tự như được mô tả ở trên cho __kworder__ tiên lượng Điều đó có nghĩa là không ảnh hưởng đến hiệu suất của kwargs nhưng thay đổi sẽ khá xâm phạm (Python sử dụng dict rất nhiều). Ngoài ra, đối với trường hợp trình bao bọc, trình thông dịch sẽ phải cẩn thận để bảo quản __order__ KWArgsDict. __gọi món__Điều này cũng giống như dict. ý tưởng __order__, nhưng kwargs sẽ là một thể hiện của lớp con dict tối thiểu mới cung cấp thuộc tính __order__. dict thay vào đó sẽ không thay đổi Liệu vấn đề trật tự chức năng?Chà, thứ tự hàm có ý nghĩa rất lớn khi nhiều hàm tồn tại bên trong nhiều phạm vi của chương trình . Để chương trình JavaScript hoạt động chính xác, các hàm trong phạm vi bên trong phải có khả năng truy cập các hàm ở phạm vi bên ngoài. Điều này đạt được thông qua khái niệm cẩu.
Python có hỗ trợ các hàm bậc cao hơn không?Đó là một khái niệm quan trọng của lập trình chức năng. Python, với tư cách là một ngôn ngữ lập trình rất linh hoạt, hỗ trợ việc sử dụng các hàm bậc cao hơn . Có một số hàm bậc cao tích hợp sẵn trong Python và chúng ta cũng có thể tự định nghĩa các hàm bậc cao hơn.
Thứ tự của các đối số trong một hàm có quan trọng không?Các vấn đề về thứ tự đối số
. R có ba cách mà các đối số do bạn cung cấp khớp với các đối số chính thức của định nghĩa hàm. theo tên đầy đủ. tôi. e. bạn gõ main = "" và R khớp main với đối số được gọi là main. The order or arguments supplied to a function matters. R has three ways that arguments supplied by you are matched to the formal arguments of the function definition: By complete name: i.e. you type main = "" and R matches main to the argument called main .
Python thực thi các chức năng theo thứ tự nào?Việc thực thi luôn bắt đầu từ câu lệnh đầu tiên của chương trình. Các câu lệnh được thực thi lần lượt theo thứ tự từ trên xuống dưới . Các định nghĩa hàm không làm thay đổi luồng thực thi của chương trình, nhưng hãy nhớ rằng các câu lệnh bên trong hàm không được thực thi cho đến khi hàm được gọi. |