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

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

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

24 ответов

16 просмотров

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

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

так я про это же, вот во фласке много где есть, например 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')) получается как бы два конструктора, которые, тем не менее, явно друг от друга отличаются

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

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

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Карта сайта