Tôi muốn bắt đầu bằng cách nói nếu các đối số là từ khóa, điều này sẽ dễ dàng như vậy:
def f[*, x="x", y= "y",z="z"]:
print[x,y,z]
def g[*, x,y,z]:
print[x,y,z,"from g!!"]
if g.__kwdefaults__ is None: #completely override defaults
g.__kwdefaults__ = f.__kwdefaults__
else: #if there are already some defaults then update
g.__kwdefaults__.update[f.__kedefaults__]
g[]
Nếu bạn đang sử dụng các đối số vị trí thì nó không hoàn toàn dễ dàng mặc dù ví dụ của bạn là một trong những trường hợp cụ thể hoạt động theo cùng một cách:
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
Nhưng đây là một trường hợp rất cụ thể:
- Các đối số để kế thừa các mặc định phải theo cùng thứ tự với bản gốc.
- Không được có bất kỳ đối số vị trí nào sau những đối số có mặc định được kế thừa
- Không được có bất kỳ đối số nào khác với các giá trị mặc định [hoặc chúng được ghi đè]
Giải pháp chung đòi hỏi khá nhiều mã nhưng cho phép bất kỳ chữ ký nào được hợp nhất vào một loại khác, ví dụ:
def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
Điều này có thể đạt được với mã sau [tôi không thể tìm thấy một cách đơn giản hơn để thực hiện nó hoạt động với trường hợp trên]
import inspect
def copy_defaults[original_f]:
"creates wrapper for DefaultArgs[original_f].copy_defaults[dest_f]"
def wrapper[dest_f]:
return DefaultArgs[original_f].copy_defaults[dest_f]
return wrapper
class DefaultArgs[dict]:
def __init__[self,func]:
spec = inspect.getfullargspec[func]
if spec.defaults:
dict.__init__[self,
zip[reversed[spec.args],
reversed[spec.defaults]
]]
else:
dict.__init__[self] #I'm not sure this is necessary
if spec.kwonlydefaults:
self.update[spec.kwonlydefaults]
def get_kwdefaults[self,keywords]:
return {k:v for k,v in self.items[] if k in keywords}
def gen_pos_defaults[self,args,defaults=None]:
if defaults is None:
defaults = []
found_default = False
for i,arg in enumerate[args,start=len[defaults]-len[args]]:
if arg in self:
yield self[arg]
found_default = True
elif i>=0:
yield defaults[i]
elif found_default: #if an argument does not have a default but is after one that does
raise TypeError["non-default argument %r follows default argument"%arg]
def copy_defaults[self,func]:
spec = inspect.getfullargspec[func]
new_kwargs = self.get_kwdefaults[spec.kwonlyargs]
if func.__kwdefaults__ is not None:
func.__kwdefaults__.update[new_kwargs]
else:
func.__kwdefaults__ = new_kwargs
func.__defaults__ = tuple[self.gen_pos_defaults[spec.args,spec.defaults]]
return func
Câu hỏi thú vị! Đây là một khả năng khác, tuy nhiên điều này đòi hỏi phải bàn giao tham số thứ hai dưới dạng tham số được đặt tên.>>> def g[y = 10]:
...
return y ** 2
...
>>>
def f[x, ** kwargs]:
...
return x * g[ ** kwargs]
...
>>>
f[5]
500
>>>
f[5, y = 0]
0
Một hạn chế của các chữ ký như
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
8 hoặc def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
9 là độc giả phải đào sâu vào mã nguồn hoặc tài liệu để tìm hiểu những gì đang diễn ra với def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
0. Bám sát một cái gì đó đơn giản và đơn giản:DEFAULT_Y = 10 def g[y = DEFAULT_Y]: ... def f[x, y = DEFAULT_Y]: ...
Điều này là khả thi:
def g[y = 10]: return y ** 2 def f[x, y = g.__defaults__[0]]: return x * g[y]
Một tùy chọn không hạn chế thứ tự định nghĩa của
def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
1 và def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
2 và sẽ vẫn hoạt động nếu hàm mặc định của def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
2 bị thay đổi một cách linh hoạt:def f[x, y = None]: kwargs = {} if y is None: kwargs['y'] = y return x * g[ ** kwargs]
Tôi muốn bắt đầu bằng cách nói nếu các đối số là từ khóa, điều này sẽ dễ dàng như vậy:
def f[ * , x = "x", y = "y", z = "z"]: print[x, y, z] def g[ * , x, y, z]: print[x, y, z, "from g!!"] if g.__kwdefaults__ is None: #completely override defaults g.__kwdefaults__ = f.__kwdefaults__ else :#if there are already some defaults then update g.__kwdefaults__.update[f.__kedefaults__] g[]
Nếu bạn đang sử dụng các đối số vị trí thì nó không hoàn toàn dễ dàng mặc dù ví dụ của bạn là một trong những trường hợp cụ thể hoạt động theo cùng một cách:
def g[y = 10]: #last argument is y return y ** 2 def f[x, y]: #last argument is y return x * g[y] f.__defaults__ = g.__defaults__ #copies the end of the defaults to f print[f[5]] # - > 500
Giải pháp chung đòi hỏi khá nhiều mã nhưng cho phép bất kỳ chữ ký nào được hợp nhất vào một loại khác, ví dụ:
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
0Nếu bạn có thể sửa đổi
def f[x,y,z=0,reverse=True]:
pass
@copy_defaults[f]
def g[a,b, #arguments for g
x,y,z, #arguments to forward to f
c=None, d="test", #some optional arguments for g
*,reverse]: #only take reverse as a keyword
pass
>>> inspect.signature[g]
2, thì điều này hoạt động:def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
1Gợi ý: 2
Trong Python, để viết các chức năng trống, chúng tôi sử dụng câu lệnh PASS. Pass là một tuyên bố đặc biệt trong Python không làm gì cả. Nó chỉ hoạt động như một tuyên bố giả., Viết mã trong bình luận? Vui lòng sử dụng IDE.GeekSforGeeks.org, tạo liên kết và chia sẻ liên kết ở đây. -Nội dung miễn phí, sự hỗ trợ nghi ngờ và nhiều hơn nữa! Công việc đến và tìm được công việc mơ ước của bạn với Usgeek Digestquizzesgeeks Campusgblog ITTHERIDECAMPUS MORTRI
Trong C/C ++ và Java, chúng ta có thể viết hàm trống như sau
Đầu ra:
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
2Gợi ý: 3
Bởi Bernd Klein. Sửa đổi lần cuối: 29 tháng 6 năm 2022., 19 tháng 10 năm 2022 đến 21 tháng 10 năm 2022, 17 tháng 10 năm 2022 đến 21 tháng 10 năm 2022
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
3def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
4Gợi ý: 4
Trong Python, bạn có thể xác định một hàm có số lượng đối số khác nhau. Trong bài viết này, bạn sẽ học cách xác định các chức năng đó bằng cách sử dụng các đối số mặc định, từ khóa và tùy ý., Cho đến nay, các chức năng có một số lượng đối số cố định. Trong Python, có nhiều cách khác để xác định hàm có thể lấy số lượng đối số khác nhau., Trong chủ đề chức năng do người dùng xác định, chúng tôi đã tìm hiểu về việc xác định hàm và gọi nó. Nếu không, cuộc gọi chức năng sẽ dẫn đến một lỗi. Đây là một ví dụ., Đôi khi, chúng ta không biết trước số lượng đối số sẽ được chuyển vào một hàm. Python cho phép chúng tôi xử lý loại tình huống này thông qua các cuộc gọi chức năng với số lượng đối số tùy ý.
Trong chủ đề chức năng do người dùng xác định, chúng tôi đã tìm hiểu về việc xác định chức năng và gọi nó. Nếu không, cuộc gọi chức năng sẽ dẫn đến một lỗi. Đây là một ví dụ.
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
5Đầu ra
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
6Nếu chúng tôi gọi nó với một số lượng đối số khác nhau, trình thông dịch sẽ hiển thị thông báo lỗi. Dưới đây là một cuộc gọi đến chức năng này với một và không có đối số cùng với thông báo lỗi tương ứng của chúng.
def g[y=10]: #last argument is y
return y**2
def f[x,y]: #last argument is y
return x*g[y]
f.__defaults__ = g.__defaults__ #copies the end of the defaults to f
print[f[5]] #->500
7