YES.Использование exec
является плохой практикой.
exec
может выполнить произвольный код.Самый важный вопрос: всегда ли вы неявно доверяете входным файлам?Ответ должен быть нет , если вы не используете этот код один раз для данных, которые вы лично производите прямо сейчас.
Ниже приведен пример входного файла, который ваш код будет читать изатем немедленно удалите весь жесткий диск.
manufacturer_num = 12345'); import os; os.system('rm -rf /
(По очевидным причинам я не проверял это на самом деле.)
Даже если вы используете свой код для данных, которые вы лично производите, но вВ будущем вы рискуете навредить себе искаженным исходным файлом, который вы написали для наполовину запомненного кода.
Предполагая, что ваш формат данных остается прежним, и без погружения в то, как вы используете переменные класса, вот как я бы написалкод.
def initialize(self):
with open(self.path, "r") as f:
for x, line in enumerate(f):
line = line.strip()
if not line:
continue # Skip blank lines
name, value = [s.strip() for s in line.split("=", maxsplit=1)]
if '=' in value:
raise ValueError(
f'Unexpected multiple "=" in line {x}: {line}')
# Initialization depends on self.path. Don't let the file
# overwrite it. Also, limit ourselves to class variables
# because, hopefully, they're declared explicitly in the
# code, and the OP said class variables.
cls = type(self)
if not hasattr(cls, name) or name == 'path':
raise AttributeError(name)
expected_type = type(getattr(cls, name))
setattr(self, name, expected_type(value))
# vars is the canonical way of accessing self.__dict__
for name, value in vars(self).items():
print(name, value)