Почему в python невозможно, чтобы метод объектов возвращал кортеж в качестве аргумента в новом методе __init__ объектов? - PullRequest
0 голосов
/ 10 ноября 2019

Почему невозможно, чтобы метод объектов возвращал кортеж в качестве аргумента в методе новых объектов init ? Почему следующий код не работает и что нужно сделать, чтобы он работал?

   class AcceptsTupleOnInit:
        def __init__(self,s,z):
            self.s = s
            self.z = z

    class ReturnsTuple:
        def return_tuple(self):
            return ("1", "2")

    r = ReturnsTuple()    
    a = AcceptsTupleOnInit(r.return_tuple())

1 Ответ

2 голосов
/ 10 ноября 2019

AcceptsTupleOnInit не принимает кортеж в качестве аргумента;требуется два отдельных аргумента. Сначала вам нужно будет распаковать кортеж.

a = AcceptsTupleOnInit(*r.return_tuple())

В качестве альтернативы, определите __init__, чтобы принять кортеж

def __init__(self, t):
    self.s = t[0]
    self.z = t[1]

или лучше, определите метод дополнительного класса, чтобы распаковать кортеж длявы.

# usage:
# a = AcceptsTupleOnInit.from_tuple(r.return_tuple())
@classmethod
def from_tuple(cls, t):
    return cls(t[0], t[1])

Во всех трех случаях вы должны предоставить кортеж как минимум с двумя значениями. Исходное определение __init__ требует, чтобы return_tuple предоставлял кортеж из точно 2 элементов;модифицированный __init__ и метод класса более гибки и просто игнорируют дополнительные элементы. Вот почему я предпочитаю оригинальную __init__ (она точна относительно того, что она требует и принимает) с методом класса, который может дезинфицировать входной кортеж по мере необходимости. Вы можете игнорировать t[2:] или вызвать исключение, если они присутствуют.

...