Python中dunder名称的来历
在 Python 中,我们经常会看到被双下划线包围的属性名和方法名,比如下面代码中的 __future__
, __all__
, __version__
, __author__
。初看还真奇怪啊,感觉别扭得很。
"""This is the example module.
This module does stuff.
"""
from __future__ import barry_as_FLUFL
__all__ = ['a', 'b', 'c']
__version__ = '0.1'
__author__ = 'Cardinal Biggles'
import os
import sys
还有比长相更别扭的,就是怎么念它们。
这种风格的名字在 Python 中有很多的名字,最开始叫魔法变量
或魔法函数
(magic)。
加两个下划线,这个名字就带有魔法了?
相信有很多人和我一样,把__all__
念作magic all
,就好像指着一匹马,我却要说牛一样。
所以后面有个人提议,把带双下划线的属性名和方法名叫dunders
。大家都觉得很好,就慢慢流行起来了。在 Python 的官方的 《 Python 代码样式指南》(PEP 8 -- Style Guide for Python Code [1]) 中,就把双下划线的名字叫做dunders
。
magic
我还知道是魔法
。我堂堂过了英语六级的人,看到dunders
直接蒙圈了。有道词典一查,解释是 1). 甘蔗渣; 2). (Dunder)人名.
。 难道是一个叫 Dunder
的人发明了双下划线命名法,为了纪念他,把带双下划线的名字都叫做 duner
? 双下划线命名也有一个发明人?这太扯了。
后面有 bing 搜索(英文搜索, bing 比 baidu 好些, google 被墙用不了),终于在 Python 官方的 wiki 中找到dunders
的真正来历了 [3]。
原来 dunder
是 Double UNDERscore
(中文双下划线)的缩写,分别取Double
的D
和 Underscore
的Under
组成。这样取名后方便发音。
在发明 dunder
之前, __init__
要念作 double underscore init
, 其中的double underscore
有17个单词,发音是6声(嘴或舌头要变换7次动作,你可以以试试),而dunder
只有6个单词,发音是2声。大大降低了手和嘴的劳动量,这个好的发明,当然举双手占成了。
Python 官方 wiki 引用如下:
Dunder (Double UNDERscore) Alias
Mark Jackson was the first to suggest dunder as a speech shorthand for double underscores (__) in a reply to a query from Pat Notz. Ned Batchelder later stressed the need for a way of pronouncing __:
An awkward thing about programming in Python : there are lots of double underscores. [snip] My problem with the double underscore is that it's hard to say. How do you pronounce __init__? "underscore underscore init underscore underscore"? "under under init under under"? Just plain "init" seems to leave out something important. I have a solution: double underscore should be pronounced "dunder". So __init__ is "dunder init dunder", or just "dunder init".
顺便给有道词典提了个建议,把dunder
在 Python 中的解释也加到词库中。
参考
[2] Using and abusing Python 's double-underscore methods and attributes
[3] Dunder (Double UNDERscore) Alias
版权声明:本文为作者原创,允许转载,但必须注明原文地址:https://www.cnblogs.com/byronsh/p/10741084.html
本文的数字签名如下:
MGUCMGkxQcQNBCyoaOxWL0OJ0egTdwWs10aSObVMEW/+owscntk9/xXsmFThQNdZ28IePwIxAOrzdI3+A2WJdmxDOHuZDOpaLQBiPhfCkvSfuqC9ph/di23XR3hk0vqiYXQ5lSgWjg==
--- 2019-7-20 9:34:19
Python中dunder名称的来历的更多相关文章
- python中的作用域与名称空间
python中的名称空间以及作用域分析 从Python解释器开始执行之后,就在内存中开辟一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征 ...
- python中的namespace
python中的名称空间是名称(标识符)到对象的映射. 具体来说,python为模块.函数.类.对象保存一个字典(__dict__),里面就是重名称到对象的映射. 可以参看下面python程序的输出: ...
- Python中常见的报错名称
Python中常见的报错名称 1.SyntaxError 语法错误.看看是否用Python关键字命名变量,有没有使用中文符号,运算符.逻辑运算符等符号是不是使用不规范. 2.IndentationEr ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- python2.7高级编程 笔记二(Python中的描述符)
Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...
- python中的collections
python中有大量的内置模块,很多是属于特定开发的功能性模块,但collections是属于对基础数据的类型的补充模块,因此,在日常代码中使用频率更高一些,值得做个笔记,本文只做主要关键字介绍,详细 ...
- python中的反射
在绝大多数语言中,都有反射机制的存在.从作用上来讲,反射是为了增加程序的动态描述能力.通俗一些,就是可以让用户参与代码执行的决定权.在程序编写的时候,我们会写很多类,类中又有自己的函数,对象等等.这些 ...
- python 中使用 global 引发了莫名其妙的问题
哪里出问题了 python 中,使用 global 会将全局变量设为本函数可用.同时,在函数内部访问变量会先本地再全局. 在嵌套函数中,使用 global 会产生不合常理的行为. 上代码: In [9 ...
- [转载]python中的sys模块(二)
#!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments are:' for i ...
随机推荐
- C# 中传参中的OUT 和 ref 区别 笔记
//out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...
- IDEA+Tomcat+Maven+SpringMVC基于Java注解配置web工程
1.在IDEA中新建Maven工程,使用archetype. 2.添加Maven依赖 <dependencies> <dependency> <groupId>ju ...
- error C2371: 'IServiceProvider' : redefinition; different basic types
需要将#include <windows.h>放到using namespace System;前面. #include <windows.h>using namespace ...
- hadoop常用操作命令
#############centos6.8IP常用操作命令#######################DEVICE=eth0TYPE=EthernetONBOOT=yesNM_CONTROLLED ...
- vue的父子组建之间的通信(-),基于props和$emit之间的传递
对于vue而言,以为其核心思想为前端组建化.所以组建之间的通信必不可少. 相信接触过Angularjs的童鞋都知道angularjs的控制器之间的通信机制. 1:父传子:官方的$broadcast() ...
- 使用Arrays.asList抛出java.lang.UnsupportedOperationException
使用 Arrays.asList("str1", "str2")生成的List,不能进行remove.add操作,会产生异常java.lang.Unsuppor ...
- 使用secureCRT和Telnet将文件压缩导出到Ubuntu中,到Ubuntu中加压缩发现:tar解压包的时候出现错误gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting now
细节描述: 问题如题所示:查找博客园和CSDN上查找问题,得到问题解决方法大致如下: 1 修改解压缩命令: 由 tar zxvf software_package.tar.gz变为tar xvf so ...
- JPG、PNG、GIF、SVG 等格式图片区别
1.图片 2. 前言 首先,我们要清楚的是,图片从类型上分,可以分为 位图 和 矢量图. 位图:位图又叫点阵图或像素图,计算机屏幕上的图是由屏幕上的发光点(即像素)构成的,每个点用二进制数据来描述其颜 ...
- 28 ArcMap 运行特别慢怎么办
小编电脑配置如下: , 虽然不是太好吧,但还是满足ArcMap运行的要求的,但不知道为什么,就是很慢,终于在无意中,发现了一个位置,取消勾选以后,ArcMap变的快很多,亲测有效 取消后台处理后,Ar ...
- framework7 入门(数据获取和传递)
数据获取 framework7自带request方法 , var app = new Framework7({...});app.request(parameters) 或者 Framework7.r ...