我有一个函数getPrices()
,有时会返回None
,大部分时间都会返回字典。
调用它时,我想在它返回None
时传递,并在实际返回字典时执行某些操作。
这就是我的方法:
if getPrices() is None:
pass
else:
if getPrices().items():
for key, value in getPrices().items():
<do something>
现在,这显然是错误的,因为我偶尔会得到这个错误
if getPrices().items():
AttributeError: 'NoneType' object has no attribute 'items'
您如何正确处理返回getPrices()
的{{1}}函数?
答案 0 :(得分:7)
您的问题是,每次getPrices()
return
或dict
None
时, if getPrices() is None: # first call
pass
else:
if getPrices().items(): # second call
for key, value in getPrices().items(): # third call
。
value = getPrices()
if value is not None:
for key, value in value.items():
# do your stuff
相反,您应该存储结果值以进行处理:
{{1}}
答案 1 :(得分:2)
由于您的getPrices
函数并不总是返回相同的内容,因此多次调用它将返回不同的结果。考虑一下:
def getPrices():
return random.random()
显然,有些代码如:
if getPrices() > 0.5:
print getPrices()
有时会返回小于0.5的值。同样,你想做类似的事情:
prices = getPrices()
if prices is None:
...
else:
...
或者更好的是:
prices = getPrices()
if hasattr(prices, 'items'):
items = prices.items()
...
else:
log.warning("Prices is not a dictionary !")
...
答案 2 :(得分:1)
或者只是抓住错误:
try:
for key, value in getPrices().items():
<do something>
except AttributeError:
#log error
#cleanup
答案 3 :(得分:0)
不是多次调用和调用函数,而是将它赋值给变量。
pricesDict = getPrices()
if pricesDict is not None:
for key, value in prices.items():
<do something>