Python中下划线的5种含义

单前导下划线 _var 当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。 下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。 单末尾下划线 var_ 有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突。总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。 双前导下划线 __var 到目前为止,我们所涉及的所有命名模式的含义,来自于已达成共识的约定。 而对于以双下划线开头的Python类的属性(包括变量和方法),情况就有点不同了。 双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。 这也叫做名称修饰(name mangling) - 解释器更改变量的名称(例如:class名为Test, 变量名为__a,那么__a会被Python解释器重写属性名为_Test__a),以便在类被扩展的时候不容易产生冲突。名称修饰会影响在一个类的上下文中,以两个下划线字符(“dunders”)开头的所有名称。 双前导和双末尾下划线 var 如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改。 单下划线 _ 按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。 同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称,会有这个用途而已。 除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。 Python下划线命名模式 - 小结 evernotecid://9326179B-5200-4478-B32E-B919B94B243C/appyinxiangcom/21231346/ENResource/p4……

阅读全文

Golang不会自动把slice转换成interface{}类型的slice

例子 我们时常会写一些interface,例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 type A interface{ Print() } type B struct { } func (b *B) Print() { fmt.Println("Here is *B") } 赋值的时候: 1 2 3 4 5 var a A a = &B{} 诶,这样看视乎没什么问题,但是我们没有办法避免使用数组,然后顺手就写了这样的代码 1 2 3 4 5 var aa []A aa = make([]*B, 10) 好的,现在翻车了,会得到一个这样的报错:……

阅读全文

Python源码阅读——PyAPI_FUNC,PyAPI_DATA,PyMODINIT_FUNC

PyAPI_FUNC(type):申明一个公共的Python API函数并且返回一个PyObject*代表对应的类型 PyAPI_DATA(type): 声明公共的Python数据和类型 PyMODINIT_FUNC: 一个Python模块初始化函数。如果这些函数是在Python内核的,他们就提供Python的内核。如果是一个扩展的模块。那可能需要拓展库支持平台的外部连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 /* All windows ports, except cygwin, are handled in PC/pyconfig.……

阅读全文

Python源码阅读——基础

阅读源码的版本: cmmit id: 9e4f2f3a6b8ee995c365e86d976937c141d867f8 在阅读Python的源码时,我们第一个想到的就是先去阅读Python的数据结构的源码。 那么,我们先去挨着看看。 数据结构 long 1 2 3 4 5 6 7 8 9 10 11 struct _longobject { PyObject_VAR_HEAD digit ob_digit[1]; }; list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 typedef struct { PyObject_VAR_HEAD /* Vector of pointers to list elements.……

阅读全文

RTTI

RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。 typeid函数 对于c++的内置数据类型,typeid可以方便的输出它们的数据类型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include <iostream> #include <typeinfo> using namespace std; int main() { short s = 2; unsigned ui = 10; int i = 10; char ch = 'a'; wchar_t wch = L'b'; float f = 1.……

阅读全文

Python3 和 Python2的区别

print Python2.7的print不是一个function Python3里的print是一个function。 Unicode Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。 由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的: 1 2 3 4 5 6 7 >>> 中国 = 'china' >>>print(中国) china Python 2.x 1 2 3 4 5 6 7 8 9 10 11 12 13 >>> str = "我爱北京天安门" >>> str '\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8' >>> str = u"我爱北京天安门" >>> str u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8' Python 3.……

阅读全文

关于Python的导入覆盖解决办法

这种问题一般来说还是不会引起的,可能会出现在datetime和time这样类型的模块中。 例如: 1 2 3 4 5 import datetime from datetime import datetime 如果写在一个文件到倒是一眼能够看出来,主要是在公司这种多人协同合作的时候,导入相关模块的时候会出现覆盖的情况需要注意。 我的建议是将系统的模块放在最后面导入,自己写的模块放在前面,不过最好跟公司的人统一一下,统一使用import datetime就行。……

阅读全文

Python使用datetime来判断近七天

strptime 使用strptime来格式化字符串 1 2 3 4 5 datetime.datetime.strptime("2019-10-02", "%Y-%m-%d") # datetime.datetime(2019, 1, 2, 0, 10) timedelta 使用timedelta来进行计算天数 1 2 3 4 5 6 7 8 9 10 11 12 13 a = datetime.datetime.strptime("2019-10-02", "%Y-%m-%d") b = datetime.datetime.strptime("2019-10-01", "%Y-%m-%d") a - b # datetime.timedelta(1) (a - b).days # 1 ……

阅读全文

Golang mgo 模糊查询的使用

在日常使用的Mongodb中,有一项功能叫做模糊查询(使用正则匹配),例如: db.article.find({"title": {$regex: /a/, $options: "im"}}) 这是我们常用Mongodb的命令行使用的方式,但是在mgo中做出类似的方式视乎是行不通的: 1 2 3 query := bson.M{"title": bson.M{"$regex": "/a/", "$options": "im"}} 大家用这个方式去查询,能查询到算我输! 下面总结一下,正真使用的方式: 在Mongodb的命令行中,我们可以使用形如 \abcd\ 的方式来作为我们的pattern,但是在mgo是直接传入字符串来进行的,也就是传入的是"\a",而不是\a\。 根据第一点,我们将代码修改一下。 1 2 3 query := bson.M{"title": bson.M{"$regex": "a", "$options": "im"}} 但是我们会发现依然不能得到我们想要的结果,那么第二点就会产生了! 在mgo中要用到模糊查询需要mgo中自带的一个结构: bson.RegEx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // RegEx represents a regular expression.……

阅读全文

关于Basic Latin踩到的一些坑

在wiki中,很多语言的字符集都包含了Basic Latin,一开始我没有细看,以为Basic Latin里面都是正常的字符集,后来在线上环境出现了问题 博主某天接到一个需求,需要过滤出某国语言的字符集(避免出现Unicode中的不可见字符),于是高高兴兴的在维基百科上找到该语言字符集抄了下来 嗯,于是,线上环境出了一点小问题,由于我们某些功能是依赖于Basic Latin里面的特殊字符来做分割的,博主过于年轻,没有细看,于是翻车,卒,享年22岁。 先看看Basic Latin里面到底是什么:https://jrgraphix.net/r/Unicode/0020-007F 仔细看里面其实有很多特殊字符的,所以大多数程序员一般都会在正则表达式里面写0-9a-zA-Z来表示Basic Latin里面的东西,为什么不直接写\x0020-\x007F是有用意,以后看见一些东西还是不要随意忽略,就像为什么写0-9a-zA-Z来表示\x0020-\x007F,你以为别人是傻逼,写这么一长串干啥,实际上你是傻逼。……

阅读全文