Tốt hơn một chút so với việc kiểm tra trực tiếp đối tượng mã và tìm ra các biến là sử dụng mô-đun kiểm tra
>>> import inspect
>>> def func[a,b,c=42, *args, **kwargs]: pass
>>> inspect.getargspec[func]
[['a', 'b', 'c'], 'args', 'kwargs', [42,]]
Nếu bạn muốn biết liệu nó có thể gọi được với một nhóm đối số cụ thể hay không, bạn cần có các đối số mà không có mặc định đã được chỉ định. Đây có thể được nhận bởi
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
Sau đó, một chức năng để cho biết những gì bạn đang thiếu từ chính tả cụ thể của bạn là
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
Tương tự, để kiểm tra các đối số không hợp lệ, hãy sử dụng
def invalid_args[func, argdict]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if varkw: return set[] # All accepted
return set[argdict] - set[args]
Và do đó, một bài kiểm tra đầy đủ nếu nó có thể gọi được là
def is_callable_with_args[func, argdict]:
return not missing_args[func, argdict] and not invalid_args[func, argdict]
[Điều này chỉ tốt khi phân tích cú pháp arg của python. Mọi kiểm tra thời gian chạy cho các giá trị không hợp lệ trong
def is_callable_with_args[func, argdict]:
return not missing_args[func, argdict] and not invalid_args[func, argdict]
9 rõ ràng là không thể phát hiện được. ] Bản tóm tắt. trong hướng dẫn này, bạn sẽ tìm hiểu về các đối số từ khóa Python và cách sử dụng chúng để gọi hàm rõ ràng hơn
Giới thiệu về đối số từ khóa Python
Hãy bắt đầu với một hàm đơn giản tính giá ròng từ giá bán và chiết khấu
Code language: Python [python]
def get_net_price[price, discount]: return price * [1-discount]
Hàm
1 có hai tham số.Code language: Python [python]
90.0
2 vàCode language: Python [python]
90.0
3Code language: Python [python]
90.0
Sau đây trình bày cách gọi hàm
1 để tính giá ròng từ giáCode language: Python [python]
90.0
5 và chiết khấu
90.0
Code language: Python [python]
6Code language: Python [python]
90.0
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
2đầu ra
Code language: Python [python]
90.0
Trong lệnh gọi hàm
7, chúng tôi chuyển từng đối số dưới dạng đối số vị trí. Nói cách khác, chúng tôi chuyển đối sốCode language: Python [python]
90.0
2 trước và đối sốCode language: Python [python]
90.0
3 thứ haiCode language: Python [python]
90.0
Tuy nhiên, lệnh gọi hàm
7 có vấn đề về khả năng đọc. Bởi vì chỉ nhìn vào lệnh gọi hàm đó, bạn không biết đối số nào làCode language: Python [python]
90.0
2 và đối số nào làCode language: Python [python]
90.0
3Code language: Python [python]
90.0
Ngoài ra, khi gọi hàm
1, bạn cần biết vị trí của từng đối sốCode language: Python [python]
90.0
Nếu không, hàm sẽ tính sai
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
14. Ví dụdef missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
1đầu ra
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
3Để cải thiện khả năng đọc, Python giới thiệu các đối số từ khóa
Sau đây cho thấy cú pháp đối số từ khóa
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
4Bằng cách sử dụng cú pháp đối số từ khóa, bạn không cần chỉ định các đối số theo thứ tự như đã xác định trong hàm
Do đó, bạn có thể gọi một hàm bằng cách hoán đổi vị trí đối số như thế này
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
5Phần sau đây trình bày cách sử dụng cú pháp đối số từ khóa để gọi hàm
1Code language: Python [python]
90.0
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
7Hoặc
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
8Cả hai đều trả về cùng một kết quả
Khi bạn sử dụng các đối số từ khóa, tên của chúng mới quan trọng chứ không phải vị trí của chúng
Lưu ý rằng bạn có thể gọi một hàm bằng cách trộn các đối số vị trí và từ khóa. Ví dụ
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
9Đối số từ khóa và tham số mặc định
Giả sử bạn có hàm
1 sau để tính giá ròng từ giá bán, thuế và chiết khấuCode language: Python [python]
90.0
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
20Trong hàm
1, tham số tax và discount có giá trị mặc định lần lượt làCode language: Python [python]
90.0
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
18 và def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
19Sau đây gọi hàm
1 và sử dụng các giá trị mặc định cho tham sốCode language: Python [python]
90.0
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
31 và 3Code language: Python [python]
90.0
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
21đầu ra
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
22Giả sử bạn muốn sử dụng giá trị mặc định cho tham số
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
31 chứ không phải 3. Cuộc gọi chức năng sau không hoạt động chính xácCode language: Python [python]
90.0
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
23… vì Python sẽ gán
5 cho giá vàCode language: Python [python]
90.0
def missing_args[func, argdict]:
return set[get_required_args[func]].difference[argdict]
36 cho thuế chứ không phải chiết khấuĐể khắc phục điều này, bạn phải sử dụng đối số từ khóa
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
24đầu ra
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
25Hoặc bạn có thể kết hợp các đối số vị trí và từ khóa
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
26đầu ra
def get_required_args[func]:
args, varargs, varkw, defaults = inspect.getargspec[func]
if defaults:
args = args[:-len[defaults]]
return args # *args and **kwargs are not required, so ignore them.
25Yêu cầu đối số từ khóa Python
Khi bạn sử dụng đối số từ khóa, bạn cần sử dụng đối số từ khóa cho các tham số còn lại
Điều sau đây sẽ dẫn đến lỗi vì nó sử dụng đối số vị trí sau đối số từ khóa