@python_beginnersЭта группа больше не существует

Страница 1686 из 1885
Zart
24.04.2017
19:16:16
D:\>type 1.py #!/usr/bin/env python3 n = int(input()) b = {} b1 = 0 while n > 0: a = input().split() if len(a) > 1: b[a[0]] = a[2:len(a)] else: b[a[0]] = "none" n -= 1 n1 = int(input()) while n1 > 0: a1 = input().split() if str(a1[0]) in b[a1[1]]: print("Yes") elif a1[1] not in b[a1[0]] or b[a1[0]] == "none": print("No") n1 -= 1 D:\>1.py 4 A B : A C : A D : B C 4 A B Yes B D Yes C D Yes D A No D:\>

Boris
24.04.2017
19:16:16
то есть 3 yes и 1 no ?

Zart
24.04.2017
19:16:31
работает нормально

Boris
24.04.2017
19:17:03
почему же pycharm'е он останавливается...

Google
Boris
24.04.2017
19:17:07
в*

Zart
24.04.2017
19:17:52
эм...

чота мне влом жабу заводить

Марк
24.04.2017
19:45:46
Зарт

Поясни, почему регекспы не парсят варики типо \x00

А воспринимают их как один символ

Zart
24.04.2017
19:48:42
поподробнее?

Марк
24.04.2017
19:50:24
Есть поток сознания. Среди потока этого всплывают комбинации типо: \x1b.+?\s. Решил регекспами выкинуть все эти \x,+, но ВНЕЗАПНО оказалось, что не так все просто

Zart
24.04.2017
19:50:58
а эти \x?? - это репр или буквально?

Марк
24.04.2017
19:51:35
не буквально. Начинаются все с \x00, а там как пойдет.

Zart
24.04.2017
19:51:41
полагаю ты опять про свои телнеты

Марк
24.04.2017
19:51:54
Угу)

Zart
24.04.2017
19:52:23
\x1b - это же анси последовательности...

Google
Zart
24.04.2017
19:52:34
очистка экрана, перемещение курсора, цвета, вот это всё

про IAC в телнете я упоминал теперь изучи CSI

Марк
24.04.2017
19:54:19
Не, я посмотрел вывод. и подумал, почему бы просто левую срань регулярками не выпилить. Но оказалось, что и регулярки такую срань плохо переваривают

Zart
24.04.2017
19:55:38
"However, most of the sequences are more than two characters and start with the characters ESC and [ (left bracket/0x5B). On 8-bit systems there is a single-character (155/0x9B /0233) as well, still the ESC[ two-character sequence is more often used than the single-character alternative (for details see C0 and C1 control codes).[13]:5.4.a This sequence is called CSI for Control Sequence Introducer (or Control Sequence Initiator). The final character of these sequences is in the range ASCII 64–126 (@ to ~/hex 0x40–0x7E).[13]:5.4 Sequences that begin with the escape character are named escape sequences. Sequences beginning with the CSI are named control sequences. A sequence may be both an escape sequence and a control sequence."

т.е. типичные анси последовательности легко ложаться на регэксп

другое дело что их надо вылавливать в потоке

Марк
24.04.2017
19:58:54
другое дело что их надо вылавливать в потоке
Паша посоветовал такой вариант: re.findall(r'[\x00-\xff]', a) , где a = \x.. Другое дело, что я не совсем понимаю, почему регекспы так хуево реагируют на такие последовательности. Думал всегда, что им похуй - будут разбирать \ x ..

Zart
24.04.2017
19:59:42
во-первых \x?? имеет смысл лишь для байтовых кодировок и не имеет ни малейшего смысла для юникода

Марк
24.04.2017
19:59:45
Как просто строку с такой последовальностью символов

Zart
24.04.2017
20:00:14
во-вторых [\x00-\xff] будет тупо ловить каждый байт

Alex
24.04.2017
20:00:44
Как в pytelegrambotapi узнать id чата ?
Ты доки совсем читать не умеешь?

Марк
24.04.2017
20:01:48
А как мне через регекспы тогда отфильтвровать строку \x1b x , чтобы только x остался?

Последний

Zart
24.04.2017
20:02:20
я выше запостил кусок инфы про CSI

можно я не буду писать регэксп за тебя?

Марк
24.04.2017
20:03:30
Лан, ссыль, откуда паста, скинь

Расписная Черепашка
24.04.2017
20:03:47
В связи с недавними событиями в чате http://telegra.ph/import-drama-04-19 Советуем перейти в новый аналогичный диалог - @ru_python_beginners

Zart
24.04.2017
20:04:21
https://en.wikipedia.org/wiki/ANSI_escape_code

Марк
24.04.2017
20:06:43
Я просто не понимаю этой срани. Допустим, идет \x.. в строке. Почему регексп сразу же вспоинимает это одним символом?

Zart
24.04.2017
20:07:16
потому что \x?? в исходном коде конвертируется в один реальный байт в памяти

Google
Zart
24.04.2017
20:07:25
это способ описывать неописуемое

>>> 'a\x61' 'aa'

один байт с циферкой 97 (0x61) можно записать и как "a" и как "\x61"

причем это свойство строковых литералов, а не регэкспа

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

поэтому в питоне есть рав строки r'...' в которых обработка эскейп последовательностей зарублена. правда сделано это очень странно

в частности вполне можно написать x = "<тут идут бинарные коды>" в определенных случаях

Марк
24.04.2017
20:13:34
Лан, а можно как-то на тупом сказать регекспам: посоны, это просто ебаная строка.

Zart
24.04.2017
20:15:18
чтото вроде re.search(b'\x1e\x5d...', ...)

вообще лучше без регэкспов вовсе

Марк
24.04.2017
20:17:16
Я смотрел седни исходники. Там спецсимволы типо IAC определены через char костантами

Zart
24.04.2017
20:18:31
логично, так как в С это всегда 1 байт

Марк
24.04.2017
20:20:06
# Telnet protocol characters (don't change) IAC = chr(255) # "Interpret As Command" DONT = chr(254) DO = chr(253) WONT = chr(252) WILL = chr(251) theNULL = chr(0)

Во

Oleg
24.04.2017
20:30:30
Людим, спасите-помогите. Не знаю что там боту в личку прислали, но telebot внезапно наелся... и при попытке получить обновления умирет с ошибкой File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/telebot/__init__.py", line 857, in <lambda> 'func': lambda msg: filter_value(msg) TypeError: <lambda>() takes 0 positional arguments but 1 was given

=(

Artem
24.04.2017
20:58:45
impot * нельзя делать во вложенной функции
Всем привет. Таки шо получается, нет никакого аналога from lib import * для nested functions ?

А то в коде много объектов в неявном виде( без упоминания родительской либы/класса и п.р. Питон 2.

Yahweh
24.04.2017
21:10:01
Всем привет. Таки шо получается, нет никакого аналога from lib import * для nested functions ?
А если вызвать у модуля __all__ (если он есть) и в цикле заимпортить?

Artem
24.04.2017
21:15:20
А если вызвать у модуля __all__ (если он есть) и в цикле заимпортить?
не совсем понял идею. У меня скрипт состоит из main функции, в котором есть еще десяток внутренних функций, тоже с параметрами. Ну так вот ни в main'e ни во вложенных я уже не могу юзать конструкцию import *

Google
Zart
24.04.2017
21:25:06
"фром ... импорт *" внутри функций работает, но только в двойке и не во всех случаях. во вложенных функциях не будет

Yahweh
24.04.2017
21:30:51
вызвать что?
метод модуля для разрешения импорта. Такой список. Смотри import string; string.__all__

Zart
24.04.2017
21:31:05
я знаю что делает __all__ ты - нет

потому что это не метод, а список/тупл строк, который задает список имен для старимпорта

когда из модуля производится стар импорт (from module import *) проверяется его аттрибут __all__, если его нет, конструируется список всех топлевел имен, не начинающихся с подчеркивания

в общем ему не поможет с его проблемой

вариантов два - либо вынести импорт на уровень модуля либо заменить звездочку на список нужных имен

Yahweh
24.04.2017
21:34:31
К.О.

Zart
24.04.2017
21:34:47
есть еще один вариант... но предлагать не буду

Stanislav
24.04.2017
21:35:08
Интересно

Zart
24.04.2017
21:38:07
хм... как я и думал, оно не пашет, лукапа не происходит

Yahweh
24.04.2017
21:38:47
def f(): ...: print(locals()) ...: import string ...: import importlib ...: for module in string.__all__: ...: locals().update({module: importlib.import_module('string', module)}) ...: print(locals())

Zart
24.04.2017
21:39:10
а вот глобалс сработает

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

def f(): ...: print(locals()) ...: import string ...: import importlib ...: for module in string.__all__: ...: locals().update({module: importlib.import_module('string', module)}) ...: print(locals())
>>> import string >>> string.__all__ Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute '__all__'

Zart
24.04.2017
21:41:19
конечно. вопрос про него был изначально

Google
Zart
24.04.2017
21:41:36
в тройке старимпорт вне топлевела вообще зарублен на уровне синтаксиса

олсо нафига импортлиб?

locals().update(vars(string))

Yahweh
24.04.2017
21:43:27
олсо нафига импортлиб?
ну, можно и __import__ но там вводить надо много. А тут два аргумента

Zart
24.04.2017
21:43:54
>>> def f(): ... print(dir()) ... import string ... print(dir()) ... locals().update(vars(string)) ... print(dir()) ... print(digits) ... >>> f() [] ['string'] ['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'string', 'whitespace'] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 7, in f NameError: name 'digits' is not defined >>>

Yahweh
24.04.2017
21:44:27
да я в курсе уже. globals() сработает

тогда какой смысл

Zart
24.04.2017
21:44:46
но глобалс меняет не тот фрейм

и это эквивалент выноса импорта из функции

Yahweh
24.04.2017
21:45:34
Интересно, а почему locals() не работает

Artem
24.04.2017
21:45:36
/me пошел курить что за глобалс..

Zart
24.04.2017
21:45:44
потому что байткод не тот

>>> dis.dis(f) 2 0 LOAD_GLOBAL 0 (print) 2 LOAD_GLOBAL 1 (dir) 4 CALL_FUNCTION 0 6 CALL_FUNCTION 1 8 POP_TOP 3 10 LOAD_CONST 1 (0) 12 LOAD_CONST 0 (None) 14 IMPORT_NAME 2 (string) 16 STORE_FAST 0 (string) 4 18 LOAD_GLOBAL 0 (print) 20 LOAD_GLOBAL 1 (dir) 22 CALL_FUNCTION 0 24 CALL_FUNCTION 1 26 POP_TOP 5 28 LOAD_GLOBAL 3 (locals) 30 CALL_FUNCTION 0 32 LOAD_ATTR 4 (update) 34 LOAD_GLOBAL 5 (vars) 36 LOAD_FAST 0 (string) 38 CALL_FUNCTION 1 40 CALL_FUNCTION 1 42 POP_TOP 6 44 LOAD_GLOBAL 0 (print) 46 LOAD_GLOBAL 1 (dir) 48 CALL_FUNCTION 0 50 CALL_FUNCTION 1 52 POP_TOP 7 54 LOAD_GLOBAL 0 (print) 56 LOAD_GLOBAL 6 (digits) 58 CALL_FUNCTION 1 60 POP_TOP 62 LOAD_CONST 0 (None) 64 RETURN_VALUE смотри на последний блок

56й байт. поэтому и не пашет

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

http://stackoverflow.com/a/13456584/356274 точное объяснение дал один из коредевов на СО

Artem
24.04.2017
21:56:22
Ладно парни, спасиб! Я понял что мне быстрее будет найти и перечислить все объекты в явном виде, чем пытаться это перенести на уровень модуля или еще как заморачиваться..)

а чем кстати удобней всего либу разворачивать в дерево / просматривать список объектов ?

Artem
24.04.2017
21:59:01

Страница 1686 из 1885

Эта группа больше не существует Эта группа больше не существует