#472 转载:Golang 自举
Golang 2021-01-30Google最近公布了实现Go 1.5自举(Bootstrap)的计划。相关文档的作者是Go核心开发者Russ Cox,他在Go语言上已经耕耘了接近6年。据Russ介绍,Google就“如何从Go源码树中去除所有的C程序”已经酝酿了一年。
#471 Python 类型提示(Type Hints)
Python Python3 2021-01-28Type Hint, 英文直译应该是输入提示。
动态类型语言有一个优点,同时也是缺点:不好做静态类型检查,IDE 或者其他开发工具很难根据代码去准确判断一个变量的类型。
Python 3.0 开始引入并逐渐完善类型注解(Type Annotation)则给 Python 静态类型检查提供了可能性。
PS: Python 运行时会忽略类型注解,不会给任何提示或警告。
PS: 之前的一些工具可以通过注释来做类型检查 (Type Comment),起到相同的作用。
PEP
SF 3107 [2006-12-02] (3.0 ) Function Annotations 开始引入函数注解
SF 3141 [2007-04-23] ( ) A Type Hierarchy for Numbers
SF 424 [2012-07-14] (3.4 ) A method for exposing a length hint
SF 451 [2013-08-08] (3.4 ) A ModuleSpec Type for the Import System
SP 484 [2014-09-29] (3.5 ) Type Hints 类型提示
IF 483 [2014-12-19] ( ) The Theory of Type Hints
IF 482 [2015-01-08] ( ) Literature Overview for Type Hints
SF 526 [2016-08-09] (3.6 ) Syntax for Variable Annotations
SA 544 [2017-03-05] (3.8 ) Protocols: Structural subtyping (static duck typing)
SA 560 [2017-09-03] (3.7 ) Core support for typing module and generic types
SA 563 [2017-09-08] (3.7 ) Postponed Evaluation of Annotations
SA 561 [2017-09-09] (3.7 ) Distributing and Packaging Type Information
SA 585 [2019-03-03] (3.9 ) Type Hinting Generics In Standard Collections
SA 586 [2019-03-14] (3.8 ) Literal Types
SA 591 [2019-03-15] (3.8 ) Adding a final qualifier to typing
SA 589 [2019-03-20] (3.8 ) TypedDict: Type Hints for Dictionaries with a Fixed Set of Keys
SA 593 [2019-04-26] (3.9 ) Flexible function and variable annotations
SA 604 [2019-08-28] (3.10) Allow writing union types as ``X | Y``
SA 613 [2020-01-21] ( ) Explicit Type Aliases 引入类型别名
SA 647 [2020-10-07] (3.10) User-Defined Type Guards 引入 TypeGuard 类型,缩小类型检查时的范围
S 649 [2021-01-11] ( ) Deferred Evaluation Of Annotations Using Descriptors
S 655 [2021-01-30] (3.10) Marking individual TypedDict items as required or potentially-missing
基础用法
如果担心类型检查会,可以使用 @no_type_check
装饰器。
def greeting(name: str) -> str:
return 'Hello ' + name
Vector = list[float]
def scale(scalar: float, vector: Vector) -> Vector:
return [scalar * num for num in vector]
Union
from typing import NoReturn
Address = tuple[str, int]
def connect(Union[Address, str]) -> NoReturn:
pass
Optional[T]
是 Union[T, None]
的简写。
def get_argument(name:str, default:Optional[str]=None) -> Union[str, None]:
pass
其他常用类型
Any
Callable
ClassVar
NewType
stub 文件
https://github.com/python/typeshed
Collection of library stubs for Python, with static types
类型检查工具
IDE,比如 PyCharm,可以配置类型检查。
VSCode 或者 Atom 之类的编辑器也可以通过插件支持类型检查。
- mypy
- pyright
- pytype
- pyre
参考:
- https://github.com/topics/typechecker?l=python&stars:%3E1000
- https://github.com/search?q=type+python+stars%3A%3E3000&s=stars&o=desc
mypy
参考资料与拓展阅读
- Python 文档, typing — Support for type hints
- 阿里云开发者社区, 利用Stub File标注Python文件类型
- 知乎, Python 类型检查指南
- Typing Python with typing
#470 IPv6 的推进速度
IP IPv6 2021-01-26#469 Python f-string
Python Python3 2021-01-25以前的字符串格式换方法
1. format
方法格式化
这种方法用的不多(对应 string.Formatter
)。
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | digit+]
attribute_name ::= identifier
element_index ::= digit+ | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s" | "a"
format_spec ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill ::= <any character>
align ::= "<" | ">" | "=" | "^"
sign ::= "+" | "-" | " "
width ::= digit+
grouping_option ::= "_" | ","
precision ::= digit+
type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
print('{} {}'.format('Hello', 'World'))
print('There are three people in my family: {0}, {1}, and I, and I love my {0} a litte more.'.format('father', 'mother'))
2. 模板字符串格式化
这种方法我只在文档中看到,从没真的用过。
PS: 被废弃的 PEP 215 曾建议采用 $'a = $a, b = $b'
这种语法。
from string import Template
Template('$who likes $what').substitute(who='tim', what='kung pao')
Template('$who likes $what').safe_substitute({'who': 'time'})
3. 百分号格式化
这应该是现在的最主流的字符串格式化方式。
printf-style String Formatting
print('Hello %s' % 'World')
print('action %s cost %.3f seconds' % ('download', 0.123456789))
print('%(language)s has %(number)03d quote types.' % {'language': "Python", "number": 2})
Python 3.6 新加入 f-string
f_string ::= (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::= "{" f_expression ["="] ["!" conversion] [":" format_spec] "}"
f_expression ::= (conditional_expression | "*" or_expr)
("," conditional_expression | "," "*" or_expr)* [","]
| yield_expression
conversion ::= "s" | "r" | "a"
format_spec ::= (literal_char | NULL | replacement_field)*
literal_char ::= <any code point except "{", "}" or NULL>
从 format
方法格式化语法中复用了很多 (格式化和 conversion 部分), 不过变得更强大了。
主要是里面支持条件语句,表达式 (包括 yield
)。
a = 3.1415926
f'{a}'
f'{a:.2f}'
f"{1 + 1}", f"{{1 + 1}}", f"{{{1 + 1}}}"
# ('2', '{1 + 1}', '{2}')
注意:f-sting 里面不能使用反斜杠转义!
f'{John\'s}'
# SyntaxError: f-string expression part cannot include a backslash
r
, s
, a
!r
->repr()
!s
->str()
!a
->ascii()
PS: ascii
方法是 Python 3 引入,和 repr
相似,但是 ascii
方法仅使用 ASCII 字符。
例如:a = '中国'; print(f'{a!a} {ascii(a)}')
输出 '\u4e2d\u56fd' '\u4e2d\u56fd'
。
print(f'{a!r}')
=
有人提议加入 !d
表示输出表达式本身,然后加上等于号,加上计算值,例如 f'1 + 1!d'
=> 1 + 1=2
。
后来实现成了这样:
a = 3.14
b = 1
print(f'a + b=') # a + b=4.140000000000001
print(f'a + b = ') # a + b = 4.140000000000001
很有趣!
参考资料与拓展阅读
- Bentley University, A Guide to f-string Formatting in Python
- RealPython, Python 3's f-Strings: An Improved String Formatting Syntax (Guide)
- Python,PEP 498 -- Literal String Interpolation
#468 Python3 的变化
Python Python3 2021-01-24#467 云原生
软件开发 云计算 云原生 微服务 2021-01-23网络上各种定义,都说是引用自某个大公司或者知名组织,看得人眼花缭乱、云里雾里。
我还是坚持我一贯的态度,大部分名词都是不同利益团体炒作出来的营销概念,世界不会因这些概念而美好半分,我们应该透过现象看本质。
#466 权力从何而来?
个人 2021-01-21近日,小区为了一些公共事务举行投票表决,但是搜集的投票人数却一直达不到要求。我所在的业主群楼主就在群里说了这么一段话:
@所有人 我这里有本栋没有投票的名单,截止今天晚上,我这里查到还没有投电子票的,清理出群,以后有什么事情也不用反映给我,我也不会看!!!待在群里发里天天发消息不看,私下发消息也不看,不支持小区改进工作,那你进群来当间谍?如果有填了纸质票的,私发消息给我,以免踢错。
我这个人虽然比较懒,多一事不如少一事,但如果事情和我息息相关还是会积极参与的。不过还有更多人,比我还懒,基本上不怎么关心身边发生的事情,哪怕和自己有关,直到权利被严重侵犯才会有所表示(甚至默默忍受)。对这种现状,我也表示很无奈。参与业委会管理工作的人,面对着无动于衷的业主,事情推动不下去,可能更加着急上火,这种心情我可以理解。不过看到这么一段话,我还是觉得不舒服,感觉就是不太好。
#465 Redis 真是单线程的?
Redis 多线程 2021-01-20Redis 核心模块是单线程架构,其高效利用 epoll I/O 多路复用机制实现了单线程高并发。
但是 Redis 服务有很多模块,整体上来说是多线程的。
#464 转载:漫画:BUG 是怎么产生的
开发者 2021-01-18