Однако описанное препятствие было не последним. Было действительно необходимо не только предоставить
Данные 3 класса объектов уже существовали в
fetchmailrc = {
'poll_interval':300,
'logfile':None,
'postmaster':'esr',
'bouncemail':TRUE,
'properties':None,
'invisible':FALSE,
'syslog' :FALSE,
# List of server entries begins here
# (Ниже начинается список серверов)
'servers': [
# Entry for site `imap.ccil.org' begins:
# (Начало записи для узла imap.ccil.org:)
{
'pollname':'imap.ccil.org',
'active':TRUE,
'via':None,
'protocol':'IMAP',
'port':0,
'timeout':300,
'dns':FALSE,
'aka':['snark.thyrsus.com','locke.ccil.org','ccil.org'],
'users': [
{
'remote':'esr',
'password':'masked_one',
'localnames':['esr'],
'fetchall':TRUE,
'keep':FALSE,
'flush':FALSE,
'mda':None,
'limit':0,
'warnings':3600,
}
' ]
}
'
# Entry for site `imap.netaxs.com' begins:
# (Начало записи для узла imap.netaxs.com:)
{
'pollname':'imap.netaxs.com',
'active':TRUE,
'via':None,
'protocol':'IMAP',
'port':0,
'timeout':300,
'dns':TRUE,
'aka':None,
'users': [
{
'remote':'esr',
'password':'masked_two',
'localnames':['esr'],
'fetchall':FALSE,
'keep':FALSE,
'flush':FALSE,
'mda':None,
'limit':0,
'warnings':3600,
}
' ]
}
'
]
}
Рассматривалась идея написания связующего уровня, который имел бы явную информацию о структуре всех 3 классов и использовал бы данную информацию для просмотра инициализатора при создании соответствующих объектов. Однако данная идея была отклонена, поскольку существовала вероятность добавления со временем новых членов класса, по мере создания новых функций в конфигурационном языке. Если бы код создания объектов был написан таким очевидным путем, то он также был бы хрупким и склонным к рассинхронизации при изменении определения классов либо структуры инициализатора, выводимой с помощью генератора отчетов --configdump
. Подобный подход приводит к бесконечному появлению ошибок.
Более надежным способом было бы использование создание программы, управляемой данными, т.е. кода, который анализировал бы форму и члены инициализатора, опрашивал бы определения классов об их членах, а затем согласовывал бы оба набора.
Программисты, работающие с Lisp и Java, называют данную методику
В примере 9.3 приведен фрагмент кода приблизительно со строки 1895 в версии 1.43.
copy_instance
def copy_instance(toclass, fromdict):