Как Pythonic устанавливает в классе статический словарь, который можно изменять во время выполнения?

1

Я заменяю статический метод в классе:

class Foo(object):

    @staticmethod
    def num_examples(subset='train'):
        if subset == 'train':
            return 6200
        elif subset == 'validation':
            return 1900
        elif subset == 'test':
            return 1900
        else:
            raise ValueError('Invalid data subset "%s"' % subset)

Я хотел бы, чтобы num_examples были в словаре, который вызывается статическим методом с той же сигнатурой, что и текущий метод num_examples, но который можно инициализировать во время выполнения.

Foo.num_examples('bar', 86) 
print(Foo.num_examples('bar'))

Я использую Python 3.x.

Теги:
python-3.x

2 ответа

1
Лучший ответ

Это и всегда будет синтаксической ошибкой:

Foo.num_examples('bar') = 86

Вы не можете назначить вызов функции в Python. Вам нужно будет адаптировать код, чтобы использовать dict, как он dict.

Foo.num_examples['bar'] = 86

Вы все равно можете писать устаревшие интерфейсы для части "получения", но часть "настройка" не может быть выполнена, как вы спрашиваете. Для обеспечения устаревшего интерфейса вы можете определить и использовать "вызываемый dict":

import warnings

notset = object()

class MyDict(dict):
    def __call__(self, key, val=notset):
        if val is notset:
            warnings.warn('this syntax is deprecated')
            return self[key]
        else:
            self[key] = val
1

Создайте dict и поместите его в статический метод, используя global.

my_dict = {}
class Foo(object):

    @staticmethod
    def num_examples(subset, value=None):
        global my_dict
        if value:
            my_dict[subset] = value
            return None
        try:
            return my_dict[subset]
        except:
            print("Not found in my_dict")

Итак, теперь это -

Foo.num_examples('bar', 86)
print(Foo.num_examples('bar'))

Если напечатать 86

  • 0
    Благодарю. Отредактировано для устранения синтаксической ошибки: Foo.num_examples ('bar', 86)
  • 0
    Вы также можете поставить диктат в классе
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню