Ввод необязательных переменных экземпляра: назначить «Нет» или «только определить тип».Python

Программы на Python
Ответить
Anonymous
 Ввод необязательных переменных экземпляра: назначить «Нет» или «только определить тип».

Сообщение Anonymous »

Сегодня я обсуждал с коллегой лучшие практики ввода для необязательных переменных экземпляра в Python 3.10+. Хотя я склонен определять только необязательные переменные экземпляра, чтобы избежать использования неоднозначных типов за счет немного большего количества «интерфейсного» кода, он обычно назначает им None, раздражая MyPy, но имея «чистый» доступ к переменным.tl;dr
Как лучше всего (PEP или что-нибудь официальное?) определять необязательные переменные экземпляра:
  • смешанная/неоднозначная/неявная типизация, но простая переменная равна None проверяет
  • чистая/однозначная/явная типизация, но немного более сложный интерфейс переменных с getattr , попробовать/исключить, требуется поднять ошибку
Рассмотрение других языков программирования, таких как C++ или Zen of Python («явное лучше, чем неявное» "), я бы сказал эти типы должны быть как можно более явными/явными/краткими, даже если за это придется немного увеличить интерфейс.
Я не нашел ничего явного по этому поводу в официальной документации Python. или руководство по стилю PEP. В официальной документации Python ясно указано только использование None для необязательных аргументов функции, но не в отношении атрибутов экземпляра. Док. модуля набора текста вообще не дает никаких подробностей по этой теме.
Знаете ли вы какие-либо ресурсы, дающие дополнительную информацию?
Метод 1 : Присвоение None необязательным переменным экземпляра
Мы можем присвоить None необязательным переменным, придав им два разных типа, но упростив проверку того, установлена ​​ли переменная:

Код: Выделить всё

class A:
def __init__(self, var_a: int | None = None) -> None:
self.optional_a: int | None = var_a  # assigned now or later - if ever
self.optional_b: str | None  # to be assigned later - if ever

def maybe_assign_b(self, var_b: str) -> None:
self.optional_b = var_b

def do_something(self) -> str:
n_reps: int = 5 if self.optional_a is None else self.otional_a

if self.optional_a is None:  #  None:
self.optional_b = var_b

def do_something(self) -> str:
# Using getattr with default (my preferred option)
n_reps: int = getattr(self, 'optional_a', 5)

try:  # 

Подробнее здесь: [url]https://stackoverflow.com/questions/79374444/typing-of-optional-instance-variables-assign-none-vs-only-define-type[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»