如何'pass on'返回值?



我有几个函数来计算一些数量的类。全局布尔值控制函数是应返回值还是将其存储为属性。我希望有一个_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'

但是Noneadd_one()当我使用

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

如何管理"一路"返回值_return_value()以便在这种情况下add_one()返回 42?

具有add_one转发_return_function的返回值。

def add_one(self, value):
return self._return_function(value+1)
  • 如果_return_function设置为_store_valueadd_one将返回None
  • 如果_return_function设置为_return_valueadd_one将转发返回的值。

您的add_one方法返回 None ,因为它缺少 return 语句。当 python 函数不包含 return 语句时,它的默认返回值为 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。这使得很难推理你的程序。

foo对象的stored_value属性也是如此 - 当你编写类方法时,你无法知道该属性是否存在,因为它取决于你在运行时传入的标志,所以你必须用测试来混淆你的方法的代码,以确保你不会引发AttributeError

最新更新