Câu trả lời được chấp nhận trước đó đã được deprecated như của Python 3.0
. Thay vì sử dụng inspect.getargspec
, bạn nên chọn lớp học Signature
thay thế nó.
Tạo Chữ ký cho chức năng rất dễ dàng thông qua signature
function:
from inspect import signature
def someMethod(self, arg1, kwarg1=None):
pass
sig = signature(someMethod)
Bây giờ, bạn có thể xem các thông số của nó một cách nhanh chóng bởi str
ing nó:
str(sig) # returns: '(self, arg1, kwarg1=None)'
hoặc bạn cũng có thể nhận được một ánh xạ tên thuộc tính cho đối tượng tham số qua sig.parameters
.
params = sig.parameters
print(params['kwarg1']) # prints: kwarg1=20
Ngoài ra, bạn có thể gọi len
trên sig.parameters
còn nhìn thấy số lượng đối số chức năng này đòi hỏi:
print(len(params)) # 3
Mỗi mục trong bản đồ params
thực sự là một Parameter
object có thuộc tính thêm làm cho cuộc sống của bạn dễ dàng hơn. Ví dụ: việc lấy thông số và xem giá trị mặc định của nó giờ đây có thể dễ dàng được thực hiện với:
tương tự cho các đối tượng còn lại trong parameters
.
Đối với Python 2.x
người dùng, trong khi inspect.getargspec
không bị phản đối, ngôn ngữ sẽ sớm được :-). Lớp học Signature
không khả dụng trong chuỗi 2.x
và sẽ không khả dụng. Vì vậy, bạn vẫn cần phải làm việc với inspect.getargspec
.
Đối với chuyển giữa Python 2 và 3, nếu bạn có mã dựa trên giao diện của getargspec
bằng Python 2 và chuyển sang signature
trong 3
là quá khó khăn, bạn có tùy chọn có giá trị của việc sử dụnginspect.getfullargspec
. Nó cung cấp một giao diện tương tự như getargspec
(một cuộc tranh luận có thể được gọi duy nhất) để lấy các đối số của một hàm trong khi cũng xử lý một số trường hợp bổ sung mà getargspec
không:
from inspect import getfullargspec
def someMethod(self, arg1, kwarg1=None):
pass
args = getfullargspec(someMethod)
Như với getargspec
, getfullargspec
trả về một NamedTuple
mà chứa các đối số.
print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
Tôi đang triển khai hệ thống thông báo, không thực sự biết trước số lượng đối số mà người nhận muốn. (Thông thường là tất cả hoặc không có.) –
câu hỏi được bảo hành đầy đủ; nếu nó không phải (vì bạn luôn có thể đọc nguồn), sẽ không có bất kỳ biện minh nào cho mô-đun thư viện chuẩn 'kiểm tra'. – flow
Rất nhiều ngôn ngữ triển khai ít nhất một tính năng không được điều chỉnh. Mô-đun 'kiểm tra' có rất nhiều tính năng khác, do đó, không công bằng khi nói rằng toàn bộ mô-đun sẽ không được điều chỉnh nếu một hàm cụ thể trong đó. Hơn nữa, thật dễ dàng để xem tính năng này có thể được sử dụng kém như thế nào. (Xem http://stackoverflow.com/questions/741950). Điều đó nói rằng, nó là một tính năng hữu ích, đặc biệt là để viết trang trí và các chức năng khác hoạt động trên chức năng. – user1612868