我有一个获取1或2个资源的功能:
def my_function():
res1 = None
if some_cond:
res1 = get_resouce1()
res2 = get_resouce2()
return res2, res1
当我这样做且some_cond
为假时,我得到一个例外:
a2, a1 = my_function()
with a2, a1:
# doing something.....
# "a1" might be None here
# thus the exception `AttributeError: __exit__`
# might be thrown when `a1` is None.
print("helllllloooo")
如何解决这个问题?
答案 0 :(得分:2)
不要返回None
,使用 Null Object Pattern 并返回虚拟上下文管理器。可以使用contextlib.contextmanager装饰器快速完成。
import contextlib
@contextlib.contextmanager
def null_ctx_mgr(): # context manager that does nothing on enter and exit
yield
def get_ctx_mgrs():
# your function - returns context managers, never returns None
return null_ctx_mgr(), null_ctx_mgr()
# actual usage
c1, c2 = get_ctx_mgrs()
with c1, c2:
print(1)
答案 1 :(得分:-3)
这里是Python的新手,但是为什么不将你的(res2,res1)返回值存储在一个元组中,然后用for循环来完成它?
喜欢:
foo = my_function()
for element in foo:
doSomething(element)
然后你可以检查一个值是否为无。
(对不起,如果这不是正确的方法,也试着学习......:))
编辑:
当然,我猜你可以在每个元素上使用和,如果它不是无