передача нескольких * arg (или ** kwargs) объекту путем явного вызова их имени - PullRequest
0 голосов
/ 07 августа 2020

Этот вопрос возник у меня, когда я изучал * arg и ** kwargs в Python. Рассмотрим этот пример:

class Person1():
    def __init__(self, name, age, *petdogs):
        self.name = name
        self.age = age
        self.petdogs = list(petdogs)

    def show_dogs(self):
        for petdog in self.petdogs:
            print(petdog)
Dummy = Person1("Dummy", 16, "A", "B", "C")
Dummy.show_dogs()
#Output:
#A
#B
#C

Можно ли передать объекту несколько * и ** аргументов?

Вот что я пробовал:

class Person2():
    def __init__(self, name, age, *petdogs, *petcats):
        self.name = name
        self.age = age
        self.petdogs = list(petdogs)
        self.petcats = list(petcats)
    def show_dogs(self):
        for petdog in self.petdogs:
            print(petdog)
    def show_cats(self):
        for petcat in self.petcats:
            print(petcats)

затем

Dummy2 = Person2(name = "Dummy", age = 16, petdogs = ("A", "B", "C"), petcats = ("D", "E"))
print("pet dogs:")
Dummy2.show_dogs()
print("pet cats:")
Dummy2.show_cats()

Я хочу, чтобы выходные параметры были похожи на приведенный выше пример

pet dogs:
A
B
C
pet cats:
D
E

Конечно, это не работает, но я интересно, есть ли способ добиться, используя *?

1 Ответ

1 голос
/ 07 августа 2020

Конструкция *args действует в функции как заполнитель для остальных переданных аргументов, поэтому у вас не может быть двух «заполнителей для остальных аргументов», потому что технически существует только один «оставшиеся аргументы» . Пример:

def f(a, b, *args):
    print(f'a = {a}, b = {b}, rest = {args}')

f(1, 2, 3, 4, 5, 6) # => a = 1, b = 2, rest = (3, 4, 5, 6)

**kwargs аналогичен по духу, но применяется к аргументам, переданным способом keyword=value: остальные переданные ключевые аргументы будут отображается внутри функции в виде dict имени kwargs. Пример:

def f(a, b, c, *args, **kwargs):
    print(f'a = {a}, b = {b}, rest = {args}, rest-kw = {kwargs}')

f(1, 2, 3, 4, 5, 6, d=7, e=8) #=> a = 1, b = 2, rest = (3, 4, 5, 6), rest-kw = {'d': 7, 'e': 8}

С тем, что вы хотите сделать, технически не существует «отдыха», который вы хотите express, поэтому вы можете go с:

class Person2():
    def __init__(self, name, age, petdogs, petcats):
        self.name = name
        self.age = age
        self.petdogs = list(petdogs)
        self.petcats = list(petcats)
    def show_dogs(self):
        for petdog in self.petdogs:
            print(petdog)
    def show_cats(self):
        for petcat in self.petcats:
            print(petcats)

и

Dummy2 = Person2(name = "Dummy", age = 16, petdogs = ("A", "B", "C"), petcats = ("D", "E"))
print("pet dogs:")
Dummy2.show_dogs()
print("pet cats:")
Dummy2.show_cats()

будут работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...