2017-09-11 17 views
8

Từ khóa have to được chuỗisố nguyên Chấp nhận như là chìa khóa của kwargs **

>>> def foo(**kwargs): 
...  pass 
... 
>>> foo(**{0:0}) 
TypeError: foo() keywords must be strings 

Nhưng bởi một số ma thuật đen, không gian tên có thể bỏ qua mà

>>> from types import SimpleNamespace 
>>> SimpleNamespace(**{0:0}) 
namespace() 

Tại sao? Và cách? Bạn có thể triển khai hàm Python có thể nhận các số nguyên trong ánh xạ kwargs không?

+1

Câu hỏi quan trọng hơn: tại sao bạn cần? –

+2

Vì vậy, trong ngắn hạn: bạn có thể định nghĩa một loại mở rộng C chấp nhận các đối số từ khóa và những người không bị hạn chế. Nhưng bạn không thể định nghĩa một hàm Python làm như vậy. –

+2

Tự hỏi nếu có phân phối python nào khác có cùng hành vi ... –

Trả lời

6

Bạn có thể triển khai hàm Python có thể nhận số nguyên trong ánh xạ kwarg không?

Không, bạn không thể. Vòng lặp đánh giá Python xử lý các hàm gọi được định nghĩa trong mã Python khác với việc gọi một đối tượng có thể gọi được định nghĩa trong mã C. Mã vòng lặp đánh giá Python xử lý việc mở rộng đối số từ khóa đã đóng chặt cửa trên các đối số từ khóa không phải chuỗi.

Nhưng SimpleNamespace không phải là ngôn ngữ được xác định bằng Python, được xác định entirely in C code. Nó chấp nhận các đối số từ khóa trực tiếp, mà không có bất kỳ xác nhận hợp lệ nào, đó là lý do tại sao bạn có thể chuyển vào một từ điển với các đối số từ khóa không phải chuỗi.

Đó có thể là lỗi; bạn có nghĩa vụ phải sử dụng C-API argument parsing functions, tất cả đều bảo vệ chống lại các đối số từ khóa không phải chuỗi. Nhưng SimpleNamespace chỉ được thiết kế là đối tượng đang giữ sys.implementation data* và không được thiết kế thực sự cho các mục đích sử dụng khác.

Có thể có các trường hợp ngoại lệ như vậy, nhưng tất cả đều là các cuộc gọi được xác định C, chứ không phải hàm Python.


* Các time.get_clock_info() method cũng chạy một thể hiện của lớp SimpleNamespace; đó là nơi duy nhất mà loại hiện đang được sử dụng.

Các vấn đề liên quan