Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“pythonic”的方式是什么;如果可能的话,就去做吧;?_Python_Python 2.7_Python 2.x - Fatal编程技术网

“pythonic”的方式是什么;如果可能的话,就去做吧;?

“pythonic”的方式是什么;如果可能的话,就去做吧;?,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,我想知道如何写下这种情况才是最好的/最具python风格的:如果可以做到,就去做。如果没有,就别管它 例如: 我有一个从数据库加载数据的函数。如果指定了可写目标,则数据将写入文件。无论是否写入文件,数据始终返回。当然,我可以检查是否存在可写位置,如果存在,则将数据写入文件。然而,这似乎是一种非python式的方式,我认为“请求原谅比允许更好” 我是这样实施的: def loadData(dest=False): data = someDBRequest() try:

我想知道如何写下这种情况才是最好的/最具python风格的:如果可以做到,就去做。如果没有,就别管它

例如: 我有一个从数据库加载数据的函数。如果指定了可写目标,则数据将写入文件。无论是否写入文件,数据始终返回。当然,我可以检查是否存在可写位置,如果存在,则将数据写入文件。然而,这似乎是一种非python式的方式,我认为“请求原谅比允许更好”

我是这样实施的:

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 all
except
子句替换为
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 all
except
子句替换为
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但不可写,您真的不想发出警报吗?