Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 13, 2015 23:37:00

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

Не знаю как это правильно назвать, не пинайте. Подобный эффект видел в модуле optparse, когда добавляем новый ключик используем dest. А потом юзаем что-то типа такого: var.some_key. Так вот как сделать чтоб обращаясь к экземпляру не получать сообщение об ошибке, что нет в var этого самого some_key. Чтоб просто молчал.

Суть в том что я буду читать конфиг и из конфига буду строчить ключи (?) в модуль и уже к ним обращаться. Но какие значения я буду использовать в конфиге я заранее не знаю. Тут видимо нужно использовать “магические методы”, но разобраться в optparse сам я не смог…



—-
memento mori

Офлайн

#2 Дек. 14, 2015 01:47:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

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)

Офлайн

#3 Дек. 14, 2015 05:31:59

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

k0st1an
optparse сам я не смог
optparse устарел используйте argparse
k0st1an
Но какие значения я буду использовать в конфиге
Вы конфиг чем будете читать? Если особый требований нет то можно использовать yaml, json, configparser.
Походу вы ищете как задать значения по умолчанию. Если так то достаточно будет задать значения по умолчанию, а потом сделать update значениями из считанного конфига. Если нужно в классе то можно сделать это с __dict__



Офлайн

#4 Дек. 14, 2015 08:02:14

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

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)

Все оказалось куда проще Если есть замечания буду рад принять критику.

doza_and
Вчера с удивлением обнаружил что optparse устарел. Давно в документацию модуля не заглядывал.

Как раз значения по-умолчанию я бы не хотел использовать. Этот модуль будет открытый и будет использоваться в закрытом проекте. Потому как-то упоминать о закрытом проекте не хочется. А ключи могут быть разные.



—-
memento mori

Офлайн

#5 Дек. 14, 2015 08:19:10

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

А зачем переопределяете __getattr__?
__getattr__ работает только когда происходит обращение к атрибуту, которого нет у объекта. А вы же сами наделали этих атрибутов setattr-ом. Таким образом ваш __getattr__ или ни разу не сработает (то есть он не нужен) либо вывалит ошибку KeyError.



Отредактировано FishHook (Дек. 14, 2015 08:19:23)

Офлайн

#6 Дек. 14, 2015 08:24:07

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

FishHook

Так мне и нужно было такое поведение, как будто я обращаюсь к атрибуту. А KeyError это не проблема, всегда можно вернуть None. Т.е. Суть в том что я не хочу иметь список готовых атрибутов. Эти атрибуты я создам с помощью чтения конфига.



—-
memento mori

Офлайн

#7 Дек. 14, 2015 08:30:49

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

Почему “как будто”? Вы же в конструкторе сделали сетаттр, атрибуты появились. Зачем вам одновременно словарь и аналогичный набор атрибутов? Если бы был только словарь, тогда __getattr__ имел бы смысл, а так нет.



Офлайн

#8 Дек. 14, 2015 08:39:21

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

А, я кажется понял. Предлагаете создать метод который будет возвращать из словаря что-то, что я прочитаю в конфиге. Ну да, это самое простое. Но я хотел именно так c.var2. Если знаете как сделать такое же поведение будет очень интересно посмотреть.

Словарь, кстати, вообще побоку. В этом примере он просто чтоб показать как можно создать атрибут и при этом работать с кодом в IDE и не видеть ошибку. А так я буду читать конфиг и создавать атрибуты.



—-
memento mori

Офлайн

#9 Дек. 14, 2015 08:48:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

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



Офлайн

#10 Дек. 14, 2015 08:59:33

k0st1an
Зарегистрирован: 2013-02-07
Сообщения: 86
Репутация: +  0  -
Профиль   Отправить e-mail  

Добавление возможно не существующих методов

FishHook
Так, что мне с этим делать? Есть у меня конфиг

[app1]
key1 = 'txt'
key2 = 'txt'
[app2]
key1 = 'txt'
key2 = 'txt'

Я прочитаю этот конфиг и буду обращаться к атрибутам так:

c.app1_key1
c.app2_key1

Было сообщение, что я ничего не понял. Возможно мы о разном говорим. Но мне нужно именно то поведение которое описал я.



—-
memento mori

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version