170 похожих чатов

А как в python принято делать перегрузку функций, например функции

чтения файла приходит, или имя файла, или входной поток. в этом случае использовать Union и проверять параметр который пришел?

24 ответов

18 просмотров

сделать функцию, которая поулчает поток

Станислав-Трухан Автор вопроса

так я про это же, вот во фласке много где есть, например https://github.com/pallets/flask/blob/41aaaf7fa07f28ef15fd1d343142e96440889a8b/src/flask/config.py#L194

Станислав Трухан
так я про это же, вот во фласке много где есть, на...

Да, но, скажем так, не все массово применяемые решения бесспорны. Эта магия с угадыванием типа переменной в условиях питона иногда подкидывает сюрпризов и в итоге не соблюдается принцип наименьшего удивления. В целом байты в исходниках почти бесплатные и обычно ничто не мешает сделать две отдельные функции с разными названиями.

Станислав-Трухан Автор вопроса
evle
Да, но, скажем так, не все массово применяемые реш...

А можно поподробнее, какие могут быть сюрпризы с угадыванием типа в python? вот искусственный пример перегрузки функции, разве так плохо делать? def foo(str_or_int: Union[str, int]) -> int: if isinstance(str_or_int, str): number = int(str_or_int) elif isinstance(str_or_int, int): number = str_or_int else: raise TypeError("str_or_int must be either str or int") return number ничего не мешает написать две отдельные функции с разными названиями, кроме лени программиста их реализовывать и необходимости придумать названия функций, что иногда бывает самым сложным

Станислав Трухан
А можно поподробнее, какие могут быть сюрпризы с у...

Тут вопрос удобства. Чем вспоминать, как называется нужная функция, которая делает то же, что и основная, но с другими данными, проще сделать перегрузку.

@singledispatch async def boof(arg: int | str): return @boof.register async def _(arg: int) -> str: return str(arg % 2) @boof.register async def _(arg: str) -> str: return f"{arg} {arg}"

Станислав-Трухан Автор вопроса
Alex Gorn
Тут вопрос удобства. Чем вспоминать, как называетс...

Так я же как раз за перегрузку, что это очень удобный механизм, но из-за того что в python нативно её нельзя сделать, то приходится костылить через singledispatch или Union

Станислав Трухан
Так я же как раз за перегрузку, что это очень удоб...

Извиняюсь. Джун ещё. Раньше в с++ работал. Рад был, когда узнал, что в 2021 добавили match как аналог switch case. Когда учился на питоне был в диссонансе, что этой функции нет

match это не switch case

SetazeR
match это не switch case

Разве? Почему не стоит?

Станислав-Трухан Автор вопроса
Usma Csce
@singledispatch async def boof(arg: int | str): ...

А много вы видели проектов, где используется singledispatch? Что-то я не могу найти примеры в реальных больших проектах

Станислав Трухан
А много вы видели проектов, где используется singl...

Я и генераторы не часто вижу, берут пустой массив делают просто, а потом туда добавляют после каждой итерации

Станислав-Трухан Автор вопроса
Sergey Gureev
есть же принцип "явное лучше неявного"

и почему этот принцип нарушается, если параметр функции объявлен явно как Union[str, int]?

Станислав Трухан
и почему этот принцип нарушается, если параметр фу...

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

Станислав Трухан
А можно поподробнее, какие могут быть сюрпризы с у...

1. В таком виде это не перегрузка, а некая её имитация средствами питона. Перегрузка, как механизм языка, это что-то похожее на пример с singledispatch. И твоим вариантом, и singledispatch иногда пользуются. 2. Теперь о подводных камнях (любой реализации). Для чего изначально она применяется? Для удобства пользователя этой функции. Чтобы не нужно было угадывать, как же называется функция, а просто предусмотреть возможные варианты входных данных. То есть есть у нас lxml.etree.parse — и мы туда туда можем как имя файла передать, так и file-like object (результат open). Круто, да. А вот у нас уже есть содержимое файла в строке, давайте и для этого сделаем поддержку. Но нет, для этого есть отдельно fromstring. Почему — а потому что как мы будем отличать строку с именем файла от строки с содержимимым? Вот и выходит, что мы вроде как умные и сделали поддержку разного формата входных данных, но не до конца. А пользователю потом гадать, что можно, а что нельзя и он путается.

Станислав-Трухан Автор вопроса
Tishka17
foo("hello") разве будет работать?

нет, но можно допилить, например так: def foo(str_or_int: Union[str, int]) -> int: if isinstance(str_or_int, str): try: number = int(str_or_int) except ValueError as e: raise TypeError(f"str_or_int '{str_or_int}' is not a number") elif isinstance(str_or_int, int): number = str_or_int else: raise TypeError("str_or_int must be either str or int") return number

Станислав Трухан
нет, но можно допилить, например так: def foo(str_...

Функция все ещё ждет строку но не работает со строкой

Станислав Трухан
нет, но можно допилить, например так: def foo(str_...

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

Станислав Трухан
нет, но можно допилить, например так: def foo(str_...

ну и да, линтер это может не увидеть, ошибка всплывет только в рантайме соот-но никакого смысла от тайпхинтов тут особо и нет

Станислав-Трухан Автор вопроса

нет, ну это пример все таки искусственный чтобы показать перегрузку и можно сказать, что пользователь функции сам дурак, что не смотрит в доку, где указано в каком виде должна быть входная строка

Станислав Трухан
нет, ну это пример все таки искусственный чтобы по...

это же касается и конструкторов следует не городить монструозный инит с тыщей аргументов на разные случаи жизни, а растащить конструкторы по методам класса например: class Foo(): def __init__(self, arg: str): pass @classmethod def from_file(cls, arg: pathlib.Path): pass return cls(arg.some.method) obj1 = Foo("some string") obj2 = Foo.from_file(pathlib.Path('some/file.txt')) получается как бы два конструктора, которые, тем не менее, явно друг от друга отличаются

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта