"与"对于变量,其中一个可能是None

时间:2016-12-20 10:03:58

标签: python python-3.x

我有一个获取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")

如何解决这个问题?

2 个答案:

答案 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)

然后你可以检查一个值是否为无。

(对不起,如果这不是正确的方法,也试着学习......:))

编辑:

当然,我猜你可以在每个元素上使用,如果它不是