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

Суть в том что я буду читать конфиг и из конфига буду строчить ключи (?) в модуль и уже к ним обращаться. Но какие значения я буду использовать в конфиге я заранее не знаю. Тут видимо нужно использовать “магические методы”, но разобраться в optparse сам я не смог…
py.user.next
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
Суть в том что я буду читать конфиг и из конфига
Вот у тебя должна быть функция, которая из конфига заполняет словарь. То же самое с аргументами командной строки. Для внутреннего использования нужно делать один словарь, в который переводятся данных из разных внешних источников. Просто у разных источников разные правила, поэтому лучше всё приводить к одним правилам.
doza_and
k0st1an
optparse сам я не смог
optparse устарел используйте argparse
k0st1an
Но какие значения я буду использовать в конфиге
Вы конфиг чем будете читать? Если особый требований нет то можно использовать yaml, json, configparser.
Походу вы ищете как задать значения по умолчанию. Если так то достаточно будет задать значения по умолчанию, а потом сделать update значениями из считанного конфига. Если нужно в классе то можно сделать это с __dict__
k0st1an
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 устарел. Давно в документацию модуля не заглядывал.

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

Так мне и нужно было такое поведение, как будто я обращаюсь к атрибуту. А KeyError это не проблема, всегда можно вернуть None. Т.е. Суть в том что я не хочу иметь список готовых атрибутов. Эти атрибуты я создам с помощью чтения конфига.
FishHook
Почему “как будто”? Вы же в конструкторе сделали сетаттр, атрибуты появились. Зачем вам одновременно словарь и аналогичный набор атрибутов? Если бы был только словарь, тогда __getattr__ имел бы смысл, а так нет.
k0st1an
А, я кажется понял. Предлагаете создать метод который будет возвращать из словаря что-то, что я прочитаю в конфиге. Ну да, это самое простое. Но я хотел именно так c.var2. Если знаете как сделать такое же поведение будет очень интересно посмотреть.

Словарь, кстати, вообще побоку. В этом примере он просто чтоб показать как можно создать атрибут и при этом работать с кодом в IDE и не видеть ошибку. А так я буду читать конфиг и создавать атрибуты.
FishHook
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
k0st1an
FishHook
Так, что мне с этим делать? Есть у меня конфиг

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

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

c.app1_key1
c.app2_key1

Было сообщение, что я ничего не понял. Возможно мы о разном говорим. Но мне нужно именно то поведение которое описал я.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB