2015-05-01 4 views
7

Я хотел посмотреть, был ли shlex хорошим выбором для чего-то, что я пытаюсь построить, поэтому я подумал, что поместил его в debug mode, чтобы поиграть с ним. Только конструктор shlex имеет этот weird thing it does: он устанавливает self.debug в 0, а затем сразу же проверяет, правда ли это.Ввод shlex в режим отладки

… 
self.debug = 0 
self.token = '' 
self.filestack = deque() 
self.source = None 
if self.debug: 
    print 'shlex: reading from %s, line %d' \ 
      % (self.instream, self.lineno) 

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

Должен ли быть способ вывода инструкции в состоянии if self.debug (и если да, то как?), Это ошибка, или есть ли какая-то третья возможность, которую я не рассматривал?

+1

Программно, конечно, есть способ: http://ideone.com/wcPVRg. Но это похоже на действительно старый код, написанный в 1999 году (https://github.com/python/cpython/blob/2bdca80eb5d7757d4542e9e12e425a54a11fe300/Lib/shlex.py), и никто не затронул эту часть вообще. o_O –

+0

Последний бит был жестко закодирован, вот несколько по-другому: http://ideone.com/lDCKvu –

+0

Это похоже на ошибку. Для 'shlex' вполне разумно потребовать, чтобы вы установили' s.debug = 1' только после построения ... но в этом случае нет веской причины для проверки 'self.debug' во время инициализатора. – abarnert

ответ

2

Во-первых, я уверен, что вы нашли ошибку, и вы должны go report it. (Вы должны убедиться, что он все еще присутствует в the latest 3.x code, но я только что проверил, и это так.) Я не вижу ничего неоправданного в объектах shlex, не позволяющих вам устанавливать debug=1 до тех пор, пока они не будут инициализированы ... но в этом случае, они не должны проверять self.debug в инициализаторе, поскольку он не может быть установлен.

Но это не так уж сложно для работы. Единственное, что вы потеряете, это первое сообщение, которое выводит только публичные атрибуты, которые вы можете распечатать самостоятельно. Так, например:

class debugging_shlex(shlex): 
    def __init__(self, *args, **kwargs): 
     # shlex is an old-style class in 2.7, so no super 
     shlex.__init__(self, *args, **kwargs) 
     self.debug = 1 
     print('shlex: reading from %s, line %d' \ 
       % (self.instream, self.lineno)) 

Больше информации для отчета об ошибке:

  • недостижимый код был добавлен в this 2000 change, и единственное изменение, с тех пор было уместить его на 80 столбцов.
  • Нет никаких модульных тестов для аргумента debug (не удивительно, учитывая, что он едва документирован и просто говорит: «Если вы хотите использовать это, прочитайте источник» ... но вы можете добавить его в любом случае).
+0

Ну, я открою ошибку, но [список необработанных открытых отчетов об ошибках на 'shlex'] (http://bugs.python.org/issue?% 40search_text = shlex и игнорировать = Файл% 3Acontent & название = shlex &% 40columns = название & ID = &% 40columns = идентификатор и этап = & создание = & творец = & деятельность = &% 40columns = активность &% 40sort = активность и актер = & любопытным = & тип = & компоненты = & версии = & зависимостями = & цессионарий = & ключевые слова = & priority = & status = 1 &% 40columns = status & resolution = & nosy_count = & message_count = &% 40group = &% 40pagesize = 50 &% 40startwith = 0 &% 40sortdir = on &% 40queryname = &% 40old-queryname = &% 40action = search) не делает дайте мне много надежды. – kojiro

+0

[Ошибка открыта] (http://bugs.python.org/issue24113). – kojiro

+0

@kojiro: Мое предположение, если вы отправляете патч, удаляющий эти 2 строки, вероятность того, что он получит более 50/50, будет принят; если вы не отправите патч, никто не будет беспокоиться, и в конечном итоге это будет еще одна 47-месячная ошибка «shlex», о которой никто не заботится. – abarnert

Смежные вопросы