我不是要求对这种哲学提出个人的"宗教"观点,而是要更具技术性.
我理解这句话是几个试金石中的一个,看你的代码是否是"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
Run Code Online (Sandbox Code Playgroud)
现在,来自程序背景,在另一个函数中,我想这样做:
if foo.bar:
# do stuff
Run Code Online (Sandbox Code Playgroud)
如果我不耐烦并且没有做初始的foo = None,我会得到一个属性异常.所以,"请求宽恕不许可"表明我应该这样做吗?
try:
if foo.bar:
# do stuff
except:
# this runs because my other code was sloppy?
Run Code Online (Sandbox Code Playgroud)
为什么我在try块中添加额外的逻辑会更好,这样我可以让我的类定义更加模糊?为什么不先定义所有内容,然后明确授予权限?
(不要打扰我使用try/except块......我在任何地方都使用它们.我不认为用它们来捕捉我自己的错误是正确的,因为我不是一个彻底的程序员.)
或者......我是否完全误解了"请求原谅"的口头禅?
我最近发现并开始使用默认字典来替换几个更庞大的结构。我在《Python 之禅》中读到,Python 的关键点之一是“应该有一种——最好只有一种——明显的方法来做到这一点。”
基于该标准(或者更实际地基于内存使用情况或速度)以下哪一项(或完全不同的东西)是最好的?我有预感第一个是正确的,但想听听其他人的意见。
my_dict = defaultdict(int)
for generic in iterable:
my_dict[generic] +=1
Run Code Online (Sandbox Code Playgroud)
或者:
my_dict = {}
for generic in iterable:
if generic not in my_dict:
my_dict[generic] = 1
else:
my_dict[generic]+=1
Run Code Online (Sandbox Code Playgroud)
或者:
my_dict = {}
for generic in iterable:
try:
my_dict[generic] += 1
except(KeyError):
my_dict[generic] = 1
Run Code Online (Sandbox Code Playgroud)
使用 my_dict = defaultdict(list) 和使用附加函数也可以这样说。假设使用多个 for 循环或其他条件,而不是简单地从单个可迭代中计算泛型值,因为这显然会具有不同的功能。