alibek
Хотя, нет.
Это не пробел.
Это символ U+00A0 и он не находится внутри \s.
Ну у тебя пробелы везде записаны там
>>> r"str = re.sub(r'[\s ]+', ' ', str)"
"str = re.sub(r'[\\s ]+', ' ', str)"
>>> list(map(ord, r"str = re.sub(r'[\s ]+', ' ', str)"))
[115, 116, 114, 32, 61, 32, 114, 101, 46, 115, 117, 98, 40, 114, 39, 91, 92, 115, 32, 93, 43, 39, 44, 32, 39, 32, 39, 44, 32, 115, 116, 114, 41]
>>>
Даже если символ какой-то необычный есть, то так и надо его записывать конкретным кодом, чтобы не путать с другими символами, выглядящими так же.
alibek
Во-вторых str это не класс, а тип.
>>> str
<class 'str'>
>>>
А ты вообще знаешь-то хоть, чем тип и класс вообще похожи и различаются?
>>> type(type)
<class 'type'>
>>>
>>> type(str)
<class 'type'>
>>>
>>> type('')
<class 'str'>
>>>
>>> type(lambda: 1)
<class 'function'>
>>>
>>> issubclass(type(lambda: 1), type)
False
>>> issubclass(type(str), type)
True
>>>
>>> issubclass('', type)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: issubclass() arg 1 must be a class
>>>
>>> issubclass(str, type)
False
>>>
alibek
На домашнем ПК добавил в adblock-фильтр строку:
Я бы на твоём месте вообще с этой штукой не копался, так как слишком уж он хреново написан. Но больше ничего нет, поэтому приходится юзать это говно в качестве единственной вещи, занявшей нишу в своё время. Открой просто его код и посмотри. Так что твои настройки запросто могут слететь сами собой при каком-нибудь обновлении. Ты их там мучился, писал, а они раз и слетели, потому что процедура обновления этого расширения не отлажена нормально.
alibek
То есть то, что форум “раскрасил зелененьким” это не класс str, а одноименная переменная str
Ну форум раскрасил потому, что никто не будет это использовать в качестве имени переменной или функции, так как все знают, что встроенные имена перекрывать нельзя. Они могут понадобится потом, а они перекрыты. Ну тупень какой-нибудь, конечно же, будет делать del, чтобы использовать в своём коде перекрытое им же самим встроенное имя. А умный человек всё-таки выучит все имена (благо они указаны все на одной
страничке) и не будет позориться так уж, как новичок уровня школоты.
alibek
Плюс бывает жадный и нежадный.
Там вообще больше понятий всяких: жадный, ленивый, ревнивый. И это всё разные вещи. Поэтому лучше их не использовать, а прямо так и разделить на два вида: длинный и короткий. Если ты ревнивый жадным назовёшь, то ты ошибёшься. Если же я ревнивый назову длинным или жадный назову длинным, то я не ошибусь в обоих случаях.
alibek
А то, что вы описали — это называется флаг ‘single line’ (или ‘multi line’), и влияет на поведение токена “.”
Это не токен, а метасимвол. Метасимвол - символ, описывающий какой-то символ.
Вообще, там понятия используются из теории грамматик. А в грамматиках есть символы и метасимволы. Символы называют терминальными символами, а метасимволы называют нетерминальными символами.
multiline - это другой флаг. Смотри, не называй флаг для совпадения точки с переводом строки multiline, потому что флаг multiline подразумевает вообще другие возможности.
alibek
Уверен даже, что внутренний оптимизатор регулярных выражений умеет сам убирать подобные дубли.
Убирает - не убирает, это неважно. Сам код должен быть чистый, а не замусоренный. Почитай нормальные коды каких-нибудь программ. И почитай замусоренные коды каких-нибудь программ. Сразу поймёшь, в чём разница. Пример - этот adblock, к которому даже прикасаться не хочется, настолько там всё наговнокожено. Жалко время тратить на него, чтобы разобраться сначала, что там ценного, а что там просто так. Другое дело какие-нибудь исходники Git'а, которые вычищены до блеска японцем. Так там и читать приятно, и сделать что-нибудь хочется, подредактировать что-то в программе.
alibek
Я как бы это знаю.
А зачем мне хранить промежуточные значения?
Ну, например, ты удаляешь какое-то из этих преобразований, потому что оно оказалось ненужным, и тут раз и ты пропускаешь момент, что оно вообще-то привязано к предыдущему преобразованию, а следующее преобразование привязано к нему. И потом наступает момент (после нескольких таких удалений и добавления новых преобразований), что ты смотришь в имя string в какой-то строке кода и просто не знаешь, что в нём находится. В то же время фиксированные разные имена в любой момент сообщают о том, кто они и что в них хранится.
alibek
Если вдруг функция будет работать не так, как ожидается, я ее прослежу в режиме отладки и просмотрю промежуточные значения уже непосредственно, на каждом шаге.
Не посмотришь ты ничего. Этот код будет на хостинге стоять где-нибудь и пользоваться им будут сто бухгалтерш тупых одновременно. Попробуй тормозни его, они разорутся там все. Они тебе просто скажут “у нас такая-то ошибка выскакивает” и ты прямо на сервере должен будешь смотреть свою программу. Какой дебаггер? На это нет времени, да и дебаггер сам может не поставиться туда.
alibek
А еще лучше — добавить отладочный вывод значения после каждой строки. Это будет правильнее, чем делать вывод report общим списком — если при выполнении функции будет что-то не то, то код до вывода report может и не дойти, а отладочный вывод максимально точно укажет место сбоя.
Да вообще-то нет. Элемент report делается в исключении. А исключение если выходит, то после выхода из функции распространяется дальше по программе. Его никак не пропустишь, если, конечно, не будешь тупить и перехватывать все исключения и гасить их все по умолчанию. Так что оно может быть и в середине, и в конце. И вот что оно будет выводить? Какое-то пятидесятое преобразование из ста преобразований, потому что предыдущие сорок стали неизвестными? Ты сэкономил имена, якобы какие-то ресурсы, но в итоге ты не сэкономил, а превратил всё в два притопа три прихлопа, с которыми потом ничего не сделаешь, пока не превратишь их в нормальные имена, где все имена разделены.
alibek
Не говоря уж о том, что это лишний расход ресурсов.
Имена в питоне ничего не расходуют.
alibek
Нельзя — это когда syntax error. Все остальное можно.
Нельзя надевать сапог на голову. Надеюсь, ты не в сапоге сидишь. Нельзя прыгать с девятиэтажки. Нельзя махать руками, как крыльями, пытаясь улететь с крыши дома. Ну ты можешь так делать, но это плохо закончится. Поэтому никто так не делает. В питоне всё то же самое, есть свои сапоги и девятиэтажки. Один ты вот в сапоге на голове поднялся на крышу уже и ищешь её край, чтобы полететь, как птица, размахивая руками-крыльями. Другие же просто крутят пальцами у виска.
alibek
Нужная задача описана в первых двух абзацах и кода там нет.
Код приведен в качестве пояснения (примера), уже после самой задачи.
Не, по одному словесному описанию задачи должно быть понятно всё без дополнительных уточнений и вопросов. Но так как изначально непонятно в этом словесном описании ничего конкретного,
xam1816'у пришлось у тебя переспросить про данные, чтобы уточнить задачу. Так вот ты должен был это всё написать сразу и без единой строчки кода. Тогда тебе бы вывалили код сразу, ну или решение тоже на словах (я обычно так делаю, потому что, во-первых, люди учатся сами и я сорву им обучение, если выдам готовый код, а во-вторых, это удобно по времени и по буквам, мне не надо много и долго писать).
alibek
Да? А как же 13 принцип дзена Питона?
Впрочем, я с ним категорически не согласен и считаю правильным основной девиз Perl.
Дзен питона соблюдается, принципы UNIX соблюдаются, принципы SOLID соблюдаются и многие другие принципы соблюдаются. А про 100500 решений я имел в виду то, что бывает кривое решение, содержащее один единственный полезный элемент, который можно взять на заметку. Потом из другого решения можно взять другой элемент полезный. Потом из третьего решения можно взять третий элемент полезный. Потом эти все элементы взятые или там идеи объединяются и делается своё оптимальное решение.