Как «передать» возвращаемое значение? - PullRequest
0 голосов
/ 11 октября 2019

У меня есть класс с несколькими функциями, которые вычисляют некоторые величины. Глобальное логическое значение определяет, должны ли функции возвращать значение или сохранять его как атрибут. Я хочу иметь одну _return_value() функцию, которая выполняет это, вместо записи if store_value … else return … в каждую из функций класса. Простое _return_value = return дает синтаксическую ошибку. Вот минимальный (не) рабочий пример:

class foo(object):
    def __init__(self, store_value=False):

        if store_value:
            self._return_function = self._store_value
        else:
            self._return_function = self._return_value

    def _return_value(self, value):
        return value

    def _store_value(self, value):
        setattr(self, 'stored_value', value)

    def add_one(self, value):
        self._return_function(value+1)

Он отлично работает для сохранения значения в качестве атрибута класса, т.е.

objFoo = foo(store_value=True)
objFoo.add_one(41)
print(objFoo.stored_value)  # prints '42'

Но функция add_one() возвращает None когда я использую

objFoo2 = foo(store_value=False)
print(objFoo2.add_one(41))  # expect to return '42', but returns 'None'

Как мне сделать так, чтобы _return_value() возвращал значение "полностью", чтобы add_one() возвращал 42 в этом случае?

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Имеет add_one forward _return_function Возвращаемое значение.

def add_one(self, value):
    return self._return_function(value+1)
  • Если _return_function установлено на _store_value, то add_one вернет None.
  • Если для _return_function установлено значение _return_value, add_one будет пересылать возвращаемое значение.
0 голосов
/ 11 октября 2019

Ваш метод add_one возвращает None, потому что в нем отсутствует оператор return. Когда функция python не содержит оператора возврата, ее возвращаемое значение по умолчанию равно None:

def add_one(self, value):
    self._return_function(value+1)

Это должно быть:

def add_one(self, value):
    return self._return_function(value+1)

Если честно, у меня нетУкажите, какую проблему пытается решить ваш класс. Возможно, небольшое объяснение этой цели приведет к ответам, которые предложат более эффективные способы ее достижения.


(Правка: я предполагаю, что отрицательное значение относится к приведенному выше абзацу, поэтому я остановлюсь на нем подробнее)немного)

Кажется, что ваш класс может быть так же легко написан другими способами, которые, возможно, чище. Я особенно не думаю, что это хорошая идея, чтобы add_one выполнял две разные функции в зависимости от флага, который вы передаете во время создания объекта. Это обязательно приведет вас к ситуации с трудно исправляемой ошибкой.

Подумайте:

>>> foobar = foo()
>>> barfoo = foo(True)    
>>> x = foobar.add_one(5)
>>> y = barfoo.add_one(5)
>>> x
6
>>> y   # y is None!
>>>

Просто взглянув на два одинаково выглядящих вызова на add_one, невозможно решить, какой из них вернет целое значение, а какой - None. Это затрудняет рассуждение о вашей программе.

То же самое касается атрибута stored_value для объектов класса foo - вы не можете знать, когда пишете методы класса, будет ли этот атрибут вообще существоватьпотому что это зависит от флага, который вы передаете во время выполнения, поэтому вам придется загромождать код вашего метода тестами, чтобы убедиться, что вы не вызываете AttributeError.

...