- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我不是在询问关于这种哲学的个人“宗教”意见,而是更多技术性的意见。
我知道这句话是测试您的代码是否“pythonic”的几个试金石之一。但对我来说,pythonic 意味着干净、简单和直观,没有加载用于糟糕编码的异常处理程序。
所以,实际的例子。我定义了一个类:
class foo(object):
bar = None
def __init__(self):
# a million lines of code
self.bar = "Spike is my favorite vampire."
# a million more lines of code
现在,来自程序背景,在另一个函数中我想这样做:
if foo.bar:
# do stuff
如果我不耐烦并且没有执行初始的 foo = None,我会得到一个属性异常。那么,“请求宽恕而不是许可”建议我应该这样做吗?
try:
if foo.bar:
# do stuff
except:
# this runs because my other code was sloppy?
为什么我最好在 try block 中添加额外的逻辑以便我可以让我的类定义更加模棱两可?为什么不先定义所有内容,然后明确授予权限?
(不要因为使用 try/except block 而责备我……我在任何地方都使用它们。我只是不认为用它们来捕获我自己的错误是正确的,因为我不是一个彻底的程序员。)
或者……我完全误解了“请求宽恕”的口头禅吗?
最佳答案
“请求宽恕,而不是许可”反对两种编程风格。 “请求许可”是这样的:
if can_do_operation():
perform_operation()
else:
handle_error_case()
“请求宽恕”是这样的:
try:
perform_operation()
except Unable_to_perform:
handle_error_case()
这是一种预期尝试执行操作可能会失败的情况,您必须以一种或另一种方式处理无法执行操作的情况。例如,如果操作正在访问文件,则该文件可能不存在。
请求宽恕的原因主要有两个:
can_do_operation()
以及运行 perform_operation()
的时间。所以无论如何你都必须处理错误。请求宽恕情况的共同点是您正在尝试执行一项操作,并且您知道该操作可能会失败。
当你编写foo.bar
时,bar
的不存在通常不会被认为是对象foo
的失败。这通常是程序员的错误:试图以非设计的方式使用对象。 Python 中程序员错误的后果是未处理 异常(如果幸运的话:当然,有些程序员错误无法自动检测到)。所以如果 bar
是对象的一个可选部分,处理这个问题的正常方法是有一个初始化为 None
的 bar
字段,如果可选部分存在,则设置为其他值。要测试 bar
是否存在,请编写
if foo.bar is not None:
handle_optional_part(foo.bar)
else:
default_handling()
您可以将 if foo.bar is not None:
缩写为 if foo.bar:
仅当 bar
在解释时始终为真作为 bool 值 - 如果 bar
可以是 0、[]
、{}
或任何其他具有错误真值的对象,则需要不是无
。如果您正在测试可选部分(而不是在 True
和 False
之间进行测试),这也更清楚。
此时你可能会问:为什么不省略 bar
的初始化,当它不存在时,用 hasattr
测试它的存在或用 捕捉它AttributeError
处理程序?因为您的代码仅在两种情况下才有意义:
bar
字段;bar
字段,表示您认为的意思。所以在编写或决定使用该对象时,您需要确保它没有具有不同含义的 bar
字段。如果您需要使用一些没有 bar
字段的不同对象,那可能不是您需要适应的唯一事情,因此您可能需要创建派生类或将对象封装在另一个。
关于python - "Ask forgiveness not permission"- 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265451/
在一个 React JSX View 中,我有一个表达式 {a.b.c} 使整个 View 崩溃,因为有时 b 是 undefined。是否有模块提供 the same behaviour than
我不是在询问关于这种哲学的个人“宗教”意见,而是更多技术性的意见。 我知道这句话是测试您的代码是否“pythonic”的几个试金石之一。但对我来说,pythonic 意味着干净、简单和直观,没有加载用
我正在尝试改进编码,最近遇到了自定义异常(exception)和“比许可更容易请求宽恕”(EAFP)的概念,但在我看来,自定义异常(exception)仍然遵循该概念。 例如,在下面的代码中,A看起来
我的任务是使用 Google Maps API 创建一个工具,餐厅可以使用该工具来定义送货区域。这是进度:http://codepen.io/keithpickering/pen/NqdzKO 用户应
为什么“请求宽恕比获得许可更容易”(EAFP)被认为是 Python 中的良好实践?作为一名编程新手,我的印象是与使用其他检查相比,使用许多 try...except 例程会导致代码臃肿且可读性差。
我是一名优秀的程序员,十分优秀!