什么是pythonic方式"如果可能的话,去做"?

时间:2017-09-06 09:44:37

标签: python python-2.7 python-2.x

我想知道如何编写这种情况最好/最pythonic:如果可以做到,那就去做吧。如果没有:请离开。

实施例: 我有一个从数据库加载数据的函数。如果给出可写目的地,则将数据写入文件。独立于正在写入的文件,始终返回数据。我可以检查是否有可写位置,如果是,则将数据写入文件。然而,它似乎是一种非pythonic的方式,我认为,请求宽恕比获得许可更好#34;

我这样实现:

def loadData(dest=False):
    data = someDBRequest()
    try:
        with open(dest, 'w') as fh:
            json.dump(data, fh)
    except:
        pass
    return data

这种感觉很糟糕,因为我实现了一个无用的东西,毕竟我希望dest不会总是设置到一个位置,因为可以在不设置它的情况下调用该函数。我也觉得应该以某种方式记录或处理这不是错误。

这是正确的方法还是你会建议更好/更pythonic?

2 个答案:

答案 0 :(得分:4)

在这个特定情况下,我会将UserControl默认为<TextBox> <TextBox.Style> <Style TargetType="TextBox"> <Style.Triggers> <DataTrigger Binding="{Binding BoolParam, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False" > <Setter Property="Visibility" Value="Collapsed" /> </DataTrigger> </Style.Triggers> </Style> </TextBox.Style> </TextBox> ,并明确检查dest

如果您还希望在None给出但是无效的情况下悄然失败,您可以使用您的方法。但是,我建议用None替换catch-all dest子句。否则你可能会发现except等等。

except IOError

一般来说,如果你依赖“请求宽恕而不是许可”的习惯,我认为最好在SyntaxError块中加入尽可能少的代码,并尽可能少地捕获异常尽可能。

答案 1 :(得分:1)

从Python 3.4开始,有一个新工具contextlib.suppress允许编写不含except Exception: pass行的类似代码。

引自docs的小例子:

from contextlib import suppress

with suppress(FileNotFoundError):
    os.remove('somefile.tmp')

从技术上讲,它是一个上下文管理器,这个是可重入的(解释为here)并且可重用。这意味着您不必每次都创建一个新的,例如:

os_errors_ignored = contextlib.suppress(OSError)

with os_errors_ignored:
    # do something

with os_errors_ignored:
    # do something else