Форум сайта python.su
0
Не знаю как это правильно назвать, не пинайте. Подобный эффект видел в модуле optparse, когда добавляем новый ключик используем dest. А потом юзаем что-то типа такого: var.some_key. Так вот как сделать чтоб обращаясь к экземпляру не получать сообщение об ошибке, что нет в var этого самого some_key. Чтоб просто молчал.
Суть в том что я буду читать конфиг и из конфига буду строчить ключи (?) в модуль и уже к ним обращаться. Но какие значения я буду использовать в конфиге я заранее не знаю. Тут видимо нужно использовать “магические методы”, но разобраться в optparse сам я не смог…
Офлайн
857
k0st1anИспользуй словарь
Так вот как сделать чтоб обращаясь к экземпляру не получать сообщение об ошибке, что нет в var этого самого some_key. Чтоб просто молчал.
>>> d = {'a': 1, 'b': 2} >>> d['a'] 1 >>> d.get('a') 1 >>> d.get('c') >>> d.get('c', 'no') 'no' >>>
k0st1anВот у тебя должна быть функция, которая из конфига заполняет словарь. То же самое с аргументами командной строки. Для внутреннего использования нужно делать один словарь, в который переводятся данных из разных внешних источников. Просто у разных источников разные правила, поэтому лучше всё приводить к одним правилам.
Суть в том что я буду читать конфиг и из конфига
Отредактировано py.user.next (Дек. 14, 2015 01:49:22)
Офлайн
253
k0st1anoptparse устарел используйте argparse
optparse сам я не смог
k0st1anВы конфиг чем будете читать? Если особый требований нет то можно использовать yaml, json, configparser.
Но какие значения я буду использовать в конфиге
Офлайн
0
py.user.next
Спасибо за подсказку. Написал следующий код
class C1: def __init__(self): self.d = { 'var1': 1, 'var2': 2 } for item in self.d: setattr(self, item, self.d[item]) def __getattr__(self, item): return self.d[item] c = C1() print(c.var2)
Если есть замечания буду рад принять критику.Офлайн
568
А зачем переопределяете __getattr__?
__getattr__ работает только когда происходит обращение к атрибуту, которого нет у объекта. А вы же сами наделали этих атрибутов setattr-ом. Таким образом ваш __getattr__ или ни разу не сработает (то есть он не нужен) либо вывалит ошибку KeyError.
Отредактировано FishHook (Дек. 14, 2015 08:19:23)
Офлайн
0
FishHook
Так мне и нужно было такое поведение, как будто я обращаюсь к атрибуту. А KeyError это не проблема, всегда можно вернуть None. Т.е. Суть в том что я не хочу иметь список готовых атрибутов. Эти атрибуты я создам с помощью чтения конфига.
Офлайн
568
Почему “как будто”? Вы же в конструкторе сделали сетаттр, атрибуты появились. Зачем вам одновременно словарь и аналогичный набор атрибутов? Если бы был только словарь, тогда __getattr__ имел бы смысл, а так нет.
Офлайн
0
А, я кажется понял. Предлагаете создать метод который будет возвращать из словаря что-то, что я прочитаю в конфиге. Ну да, это самое простое. Но я хотел именно так c.var2. Если знаете как сделать такое же поведение будет очень интересно посмотреть.
Словарь, кстати, вообще побоку. В этом примере он просто чтоб показать как можно создать атрибут и при этом работать с кодом в IDE и не видеть ошибку. А так я буду читать конфиг и создавать атрибуты.
Офлайн
568
class C(object): def __getattr__(self, item): if item.startswith("myattr_"): return int(item.split("_")[1]) c = C() print c.myattr_54 print c.myattr_21 print c.myattr_232
Офлайн
0
FishHook
Так, что мне с этим делать? Есть у меня конфиг
[app1] key1 = 'txt' key2 = 'txt' [app2] key1 = 'txt' key2 = 'txt'
c.app1_key1 c.app2_key1
Офлайн