Следует ли по-прежнему объявлять «константы», относящиеся к классу, на уровне модуля?

В PEP 8 сказано, что «Константы обычно определяются на уровне модуля [… ] ". Это имеет смысл для стандартной библиотеки, где константы имеют тенденцию относиться ко всему модулю, а не к конкретному классу (например, zlib.MAX_WBITS или re.UNICODE ). Однако сейчас я пишу модуль, где все константы связаны с отдельными классами.

Модуль разработан, чтобы позволить программам Python работать с форматом сериализации, зависящим от приложения, в котором блоки данных организованы в «фрагменты», а эти фрагменты дополнительно упорядочены в «области» ". Размеры фрагментов и регионов - это полезные константы, которые нужно раскрыть, и я делал это как свойства класса, пока не наткнулся на эту строку в PEP 8.

Я склонен оставить их такими, какие они есть (PEP 8 также говорит, что «глупая последовательность - в конце концов, хобгоблин маленьких умов»), но хочу быть уверенным, что я не тоже тем самым сильно нарушу ожидания пользователей. (Модуль еще не выпущен, поэтому обратная совместимость не является проблемой.)

Для справки: " но многомерный, который я хочу использовать для хранения нескольких подсчетов в серии циклов.

Приложение читает текстовый файл журнала, ищет предопределенную строку, вытаскивает дату в этой строке, когда строка найдена , и увеличивая счетчик совпадений этой строки в эту дату.

В PHP это было бы так просто:

// Initialize
$count_array[$string_date][$string_keyword] = 0;

...

// if string is found
$count_array[$string_date][$string_keyword] += 1;

...

// To ouput contents of array
foreach($count_array as $date -> $keyword_count_array) {
    echo $date; // output date

    foreach($keyword_count_array as $keyword -> $count) {
        echo $keyword . ": " . $count;
    }
}

Похоже, что в C # он немного больше задействован (что неплохо). Я попытался использовать предложение, которое я нашел по другому аналогичному вопросу, но я действительно не понимаю, как увеличивать или перебирать / выводить содержимое:

// Initialize
var count_array = new Dictionary>();
count_array = null;

...

// if string is found - I think the second reference is supposed to be a Dictionary object??
count_array[string_date.ToShortDateString()][string_keyword]++;

...

// To ouput contents of "array"
foreach (KeyValuePair> kvp in exportArray)
{
    foreach(KeyValuePair kvp2 in kvp.Value) 
    {
        MessageBox.Show(kvp.Key + " - " + kvp2.Key + " = " + kvp2.Value);
    }
}

Я даже на правильном пути? Или у кого-то есть лучший / более чистый метод имитации приведенного выше кода PHP?

UPDATE

С помощью приведенного выше кода C # я действительно получаю ошибку в строке «// если строка найдена». Ошибка " Так что прямо сейчас я не знаю, как увеличить.

ОБНОВЛЕНИЕ 2

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

6
задан Aaryn 23 February 2011 в 21:01
поделиться