Какой питон / более быстрый способ объявить константы уровня модуля с вычисленными значениями? - PullRequest
2 голосов
/ 19 мая 2011

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

Но некоторые константы нелегко запрограммировать. Например, re pattern объекты, которые я могу получить только с re.compile. Итак, я написал

import re

_my_fine_pattern_string = r"some obnoxious regex"
MY_FINE_PATTERN         = re.compile(_my_fine_pattern_string)

def spam(eggs):
...

Это работало вчера в сценарии, который я выполняю напрямую. Но теперь мне интересно. Будет ли этот код выполняться на import? Это замедлит выполнение? Буду ли я сожжен за это? Есть ли лучший / более быстрый способ сделать это?

Ответы [ 3 ]

6 голосов
/ 19 мая 2011

Да, это нормально.Будет выполнено при импорте.Если вам нужно выполнить значительное количество вычислений (чего нет re.compile), это замедлит импорт - но это так и должно быть, поскольку вам все равно нужны константы для выполнения вашей работы.

Почему вы используете двойные подчеркивания?Если константы предназначены для экспорта, они не должны иметь префикса с подчеркиванием, а если нет, то они должны иметь одно подчеркивание.(Double имеет особое значение в контексте наследования классов, но обычно его не следует использовать где-либо еще.)

2 голосов
/ 19 мая 2011

Константы уровня модуля всегда должны именоваться с UPPER_CASE_WITH_UNDERSCORES (см. Руководство по стилю Python !).

MY_FINE_PATTERN_STRING = r"some obnoxious regex"
MY_FINE_PATTERN = re.compile(_my_fine_pattern_string)

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

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

1 голос
/ 19 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...