Скажем, у меня есть класс людей
class person()
def __init__(self, fname:str, lname:str):
self.fname = fname
self.lname = lname
Как мне сказать, что я ожидаю список людей?
class group()
def __init__(self, groupName:str, people:person|person[]):
self.groupName = groupName
self.people = people
Могу я использовать... people:person|list[person]):
?
Я думал, что могут быть некоторые «группы» только с 1 «человеком». Но имеет смысл форсировать список, так как в списке может быть только 1 элемент. Спасибо всем!
Список person
объектов — это list[person]
(или typing.List[person]
, до версии Python 3.9).
Да, вы можете использовать people: list[person]
, чтобы указать, что people attribute
должен быть списком объектов-людей. Символ |
в этом случае не используется, потому что вы хотите указать только один тип, который представляет собой список объектов-людей.
class group():
def __init__(self, groupName:str, people:list[person]):
self.groupName = groupName
self.people = people
Когда вы используете символ |
, вы указываете, что атрибут может хранить тот или иной тип. Например, person | list[person]
будет означать, что атрибут может хранить либо один объект-человек, либо список объектов-лиц.
Это было моим первоначальным намерением. Но почитав комментарии и подумав, я понял, что будет меньше работы, если принять список[объект] с 1 элементом в нем.
Ты можешь сделать
class Person:
def __init__(self, fname: str, lname: str):
self._fname = fname
self._lname = lname
class Group:
def __init__(self, name: str, people: Person|list[Person]):
self._name = name
self._people = people
и mypy
будет счастлив. Тем не менее, вероятно, лучше просто иметь people: list[Person]
(т. е. принимается только список) и иметь список из 1 элемента, если в группе только один человек. В противном случае вам, возможно, придется реализовать разные функции-члены для разных типов (или кучу ветвей if
), если эти функции используют self._people
.
mypy
может быть счастлив, но вы будете сильно ограничены в том, что вы можете делать с people
(и, соответственно, self._people
), потому что он будет принимать только операции, которые допустимы как для Person
, так и для list[Person]
объектов.
Хотя этот метод может иметь некоторые недостатки, могут быть некоторые сценарии, в которых использование обоих может быть необходимым или желательным. @JustLearning спасибо за ваш вклад.
Зачем часть
person|
, если вы конкретно ожидаете список, а неperson
?