В
3.10, помимо всего прочего, завезли паттерн матчинг. И вы об этом, конечно, слышали. А вы слышали про functools'овый singledispatch который доступен аж со времён 3.4 и реализует матчинг типов аргументов в функции? Выглядит это так:
Recipient = Email | SmsNumber
@singledispatch
def send_message(message: str, recipient: Recipient):
raise NotImplemented()
@send_message.register
def send_message_via_email(message: str, recipient: Email):
# Send message via email by somehow
@send_message.register
def send_message_via_sms(message: str, recipient: SmsNumber):
# Send message via sms by somehow
some_email = Email('some@email.com')
some_phone = SmsNumber('+123456789')
send_message('message', some_email)
send_message('message', some_phone)
Ну практически haskell, нет? Увы, нет, ведь в python значение — это не то же самое что и тип, поэтому и возможности заматчить по значению у нас в этом случае нет. Но, так или иначе,
singledispatch, бывает, здорово помогает организовать код лаконично и читаемо.А вот чего в python не завезли (по, в целом, понятным причинам) так это возможности запилить sync и async реализации функции под одним именем. И это печально.