【发布时间】:2017-02-18 19:08:24
【问题描述】:
我有一些代码块需要被函数包装。
try:
if config.DEVELOPMENT == True:
# do_some_stuff
except:
logger.info("Config is not set for development")
那我再来一次:
try:
if config.DEVELOPMENT == True:
# do_some_another_stuff
except:
logger.info("Config is not set for development")
那么,我该如何包装这个“do_some_stuff”和“do_some_another_stuff”?
我正在尝试使用 contextmanager 编写函数:
@contextmanager
def try_dev_config(name):
try:
if name is not None:
yield
except Exception as e:
print "not dev config"
with try_dev_config("config.DEVELOPMENT"):
# do_some_stuff
我得到了一个错误:
RuntimeError: 生成器没有产生
【问题讨论】:
-
你不应该将事情与真实进行比较;这是不必要的多余。将 `if config.DEVELOPMENT == True` 更改为
if config.DEVELOPMENT。 -
为什么要传入一个字符串?只需传入值本身:
with try_dev_config(config.DEVELOPMENT):?访问该属性有问题吗? -
@MartijnPieters,谢谢
with try_dev_config(config.DEVELOPMENT):工作很好,但如果 config.DEVELOPMENT 是False我又得到 RuntimeError: generator didn't yield。 -
对,是的,上下文管理器不是有条件地运行块的地方。不要将
if放在上下文管理器中,将其放在外面。 -
@MartijnPieters,如果 config.DEVELOPMENT == True,我该如何编写运行任何代码块的函数?
标签: python try-catch wrapper decorator