Hướng dẫn how to pass empty argument in python - cách truyền đối số rỗng trong python

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ể:

  1. 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.
  2. 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
  3. 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
0

Nế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
1


Gợ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
2


Gợ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
3

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
4


Gợ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
6

Nế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


Làm thế nào để bạn vượt qua một giá trị trống trong Python?

Không giống như các ngôn ngữ lập trình khác như PHP hoặc Java hoặc C, Python không có giá trị null.Thay vào đó, có từ khóa 'không có' mà bạn có thể sử dụng để xác định giá trị null.there is the 'None' keyword that you can use to define a null value.

Làm thế nào để bạn vượt qua một cuộc tranh luận trong Python?

Thông tin có thể được truyền vào các chức năng như đối số.Đối số được chỉ định sau tên hàm, bên trong dấu ngoặc đơn.Bạn có thể thêm nhiều đối số như bạn muốn, chỉ cần tách chúng bằng dấu phẩy.Arguments are specified after the function name, inside the parentheses. You can add as many arguments as you want, just separate them with a comma.

Bạn có thể vượt qua không một cuộc tranh luận?

Không có gì thường được sử dụng làm giá trị đối số mặc định trong Python vì nó cho phép chúng tôi gọi hàm mà không cung cấp giá trị cho một đối số không bắt buộc trên mỗi lần gọi chức năng.Không có gì đặc biệt hữu ích cho các đối số danh sách và dict. because it allows us to call the function without providing a value for an argument that isn't required on each function invocation. None is especially useful for list and dict arguments.