我想知道如何编写这种情况最好/最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?
答案 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