Анализатор для синтаксиса конфигурационного файла
Такая тактика выглядела бесперспективной. Даже если не принимать во внимание объем необходимой дублирующей работы, очень трудно быть уверенным в том, что два синтаксических анализатора, написанных на двух различных языках, допускают использование одной и той же грамматики. Обеспечить в дальнейшем их синхронизацию по мере развития конфигурационного языка будет чрезвычайно сложно. Данный подход нарушал бы правило SPOT, описанное в главе 4.
На какое-то время автор был поставлен в тупик данной проблемой. Разрешило ее интуитивное понимание того, что программа
Основное препятствие было преодолено. Интерпретатор Python мог затем оценить вывод
Однако описанное препятствие было не последним. Было действительно необходимо не только предоставить
Данные 3 класса объектов уже существовали в
'port':0, 'timeout':300, 'dns69:TRUE, "aka":None,
'users': [ {
"remote":"esr", "password":"masked_two", 1localnames':["esr"], 'fetchall':FALSE, 'keep':FALSE, 'flush':FALSE, "mda":None, 'limit':0, 1 warnings 1:3600,
}
1
} /
]
}
Пример 9.3. Код метакласса copy_instance def copy_instance(toclass, fromdict):
# Make a class object of given type from a conformant dictionary.
class_sig = toclass._diet_.keysO; class_sig. sort ()
dict_keys = fromdict.keys(); dict_keys.sort() common = set_intersection(class_sig, dict_keys) if 'typemap' in class_sig:
class_sig.remove(1typemap') if tuple(class_sig) != tuple(dict_keys): print "Conformability error"
# print "Class signature: " + "class_sig"
# print "Dictionary keys: " + ~dict_keys" print "Not matched in class signature: "+ \
"set_diff(class_sig, common)" print "Not matched in dictionary keys: "+ \
"set_diff(dict_keys, common)~
sys.exit(1) else:
for x in dict_keys:
setattr(toclass, x, fromdict[x])
Большую часть в примере представляет код контроля ошибок, учитывая возможность того, что члены класса и генерация отчета - -conf igdump выпали из синхронизации. Такая проверка гарантирует, что в случае возникновения сбой в коде будет обнаружен на ранней стадии, т.е. реализуется правило исправности. Главной частью кода являются две последние строки, которые устанавливают атрибуты в классе из соответствующих членов в словаре. Данные строки эквивалентны следующим строкам.