Кто-нибудь объяснит мне, почему type (foo) (bar) так сильно не рекомендуется? - PullRequest
2 голосов
/ 01 сентября 2010

У меня есть набор переменных конфигурации, который выглядит примерно так:

self.config = {
    "foo": "abcdef",
    "bar": 42,
    "xyz": True
}

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

def updateconfig(self, key, value):
    if key in self.config:
        self.config[key] = type(self.config[key])(value)

Однако, #python в Freenode почти казался обиженным , что я бы предложил такое решение Может кто-нибудь сказать мне, почему это плохая практика?

Ответы [ 2 ]

5 голосов
/ 01 сентября 2010

Не все типы поддерживают идиому «вызовите тип со строкой, чтобы создать новый экземпляр этого типа». Однако, если вы гарантируете, что у вас только есть такие типы в вашем файле config (возможно, с проверкой работоспособности во время инициализации), и поместите подходящую try / except защиту вокруг вашего попытка преобразования (чтобы справиться с пользовательскими ошибками, такими как опечатки, far лучшим способом, чем смерть при трассировке стека ;-), нет ничего «изначально неправильного» в использовании этой функциональности для типов, которые поддерживают это.

0 голосов
/ 01 сентября 2010

Не говоря уже о том, что в Python есть модуль конфигурации, вот как я бы поступил с config, на примере целочисленного значения "bar".+1 для alex как '' для способа сказать False, смотрите значение "xyz"!

config = {
    "foo": "abcdef",
    "bar": "42",
    "xyz": "True" ## or 'Yes' or anything not False, "" for False
}

bar = ''
while not bar:
    barinput = raw_input('Enter property  bar, integer (1..99): ')
    try:
        if 0 < int(barinput) < 100:
            pass
        else:
            raise ValueError("%s is not integer in range 1..99" % barinput)
    except ValueError as e:
        print(str(e)+"\nWrong input, try again")
    else:
        print("Saving correct value")
        bar = config["bar"] = barinput
print('New value of "bar" in config: %i' % int(config["bar"]))

Значение может быть сохранено как int в конфигурации также, но нам не нужно для type какмы знаем, что вводим целое число.

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