“pythonic”的方式是什么;如果可能的话,就去做吧;?
我想知道如何写下这种情况才是最好的/最具python风格的:如果可以做到,就去做。如果没有,就别管它 例如: 我有一个从数据库加载数据的函数。如果指定了可写目标,则数据将写入文件。无论是否写入文件,数据始终返回。当然,我可以检查是否存在可写位置,如果存在,则将数据写入文件。然而,这似乎是一种非python式的方式,我认为“请求原谅比允许更好” 我是这样实施的:“pythonic”的方式是什么;如果可能的话,就去做吧;?,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,我想知道如何写下这种情况才是最好的/最具python风格的:如果可以做到,就去做。如果没有,就别管它 例如: 我有一个从数据库加载数据的函数。如果指定了可写目标,则数据将写入文件。无论是否写入文件,数据始终返回。当然,我可以检查是否存在可写位置,如果存在,则将数据写入文件。然而,这似乎是一种非python式的方式,我认为“请求原谅比允许更好” 我是这样实施的: def loadData(dest=False): data = someDBRequest() try:
def loadData(dest=False):
data = someDBRequest()
try:
with open(dest, 'w') as fh:
json.dump(data, fh)
except:
pass
return data
这让我感觉很糟糕,因为我实现了一个无用的except,毕竟我希望dest不总是被设置为一个位置,因为可以在不设置它的情况下调用函数。我也觉得这不是一个应该记录或以某种方式处理的错误
这是一种正确的方法,还是您会建议一些更好/更具pythonic的方法?在这个特定的例子中,我会将
dest
默认为None
,并会显式检查它是否None
如果您还希望在给定了dest
但无效时悄悄失败,那么可以使用您的方法。但是,我主张将catch allexcept
子句替换为except IOError
。否则,您可能会捕获诸如SyntaxError
等内容
def loadData(dest=None):
data = someDBRequest()
if dest:
try:
with open(dest, 'w') as fh:
json.dump(data, fh)
except IOError:
pass
return data
一般来说,如果你确实依赖于“请求原谅比获得许可更好”的成语,我认为最好在
try
块中放入尽可能少的代码,并捕获尽可能少的异常。在这个特定的例子中,我会将dest
默认为None
,并会显式地检查它是否有None
如果您还希望在给定了dest
但无效时悄悄失败,那么可以使用您的方法。但是,我主张将catch allexcept
子句替换为except IOError
。否则,您可能会捕获诸如SyntaxError
等内容
def loadData(dest=None):
data = someDBRequest()
if dest:
try:
with open(dest, 'w') as fh:
json.dump(data, fh)
except IOError:
pass
return data
总的来说,如果你确实依赖于“请求原谅比请求允许更好”的成语,我认为最好在
try
块中放入尽可能少的代码,并尽可能少地捕获异常。从Python 3.4开始,有一个新工具contextlib.suppress
,它允许编写类似的代码,而无需异常:pass
行
引用的小例子如下:
从技术上讲,它是一个上下文管理器,这个是可重入(解释的)和可重用的。这意味着您不必每次都创建一个新的,例如:
os_errors_ignored = contextlib.suppress(OSError)
with os_errors_ignored:
# do something
with os_errors_ignored:
# do something else
从Python3.4开始,有一个新工具
contextlib.suppress
,它允许编写类似的代码,而不需要异常:pass
行
引用的小例子如下:
从技术上讲,它是一个上下文管理器,这个是可重入(解释的)和可重用的。这意味着您不必每次都创建一个新的,例如:
os_errors_ignored = contextlib.suppress(OSError)
with os_errors_ignored:
# do something
with os_errors_ignored:
# do something else
另一个原则是“显性优于隐性”。我也不认为你在这里写的代码可读性很强,你自己也不喜欢。做你觉得最好的事。如果提供了dest但不可写,您真的不想发出警报吗?另一个原则是“显式优于隐式”。我也不认为你在这里写的代码可读性很强,你自己也不喜欢。做你觉得最好的事。如果提供了dest但不可写,您真的不想发出警报吗?