综合影响范围和影响程度降序排列.
TypedDict 在描述较复杂的嵌套字典时表现乏力 | typehint
主要表现为:
- 书写顺序混乱
- (pycharm) 对值的类型判断存在问题, 特别是处理后向引用时
- 结构可读性差
示例:
open 函数的 encoding 默认值不是 ‘utf-8’ | builtins; open
略.
报错定位不够精确 | exception
例如 KeyError, IndexError, AssertionError 在错误发生时, 如果不进行完整的捕获, 无法直接看到自己最关心的变量的值是什么.
assert filename.endswith('.jpg')
x = somevar[0][1]
ps: 据传 python 3.11 将对此完善.
pycharm 提示功能在显示 open 函数时严重影响体验 | pycharm
如下图, 键入 open() 后给出的提示完全遮住了编辑界面:
windows 版 pip 在挂 vpn 的情况下使用 pip install 出现 ssl 认证失败 | pip; urllib3
经观察, 是因为 ~/site-packages/pip/_vendor/urllib3 的版本引发的问题:
urllib3 v1.26+ 会出现此问题, 降级到 v1.25.9 可解决.
返回 tuple 时, 如果 tuple 只有一个元素, 写法上不明显, 可能看漏掉 | syntax
def foo() -> tuple[str, ...]:
return 'hello world',
对 *args 和 **kwargs 进行类型注解存在限制 | typehint
def foo(*args: tuple[str, str, int], **kwargs: dict[str, bool])):
...
def bar(*args: str | int, **kwargs: bool):
...
单行推导式的语序设计对人类不友好 | syntax
我希望的写法:
names = [name.title() for name in row for row in table]
实际的写法:
names = [name.title() for row in table for name in row]
注: 个人猜测是早期的语法解析器的工作方式导致的必须这种写法? 跟 annotation 的前向引用问题似乎出自同源.
lambda, partial 行为不一致 (lambda 延迟赋值) | lambda
from functools import partial
def foo(value):
print(value)
m = []
n = []
for i in range(10):
m.append(lambda : foo(i))
n.append(partial(foo, i))
m[0]()
n[0]()
lambda 不支持多行表达式 | lambda
略.
pycharm 对 typing.TypedDict 的实例化写法支持度非常差 | pycharm; typehint
from typing import TypedDict
class T:
FuncName = str
FuncInfo = TypedDict('FuncInfo', {
'name': FuncName,
})
Iterable, Sized 二者不可得兼? | typehint
import typing as t
def some_func(a: t.Iterable[str]):
for i in a: print(i)
print(len(a))
import typing as t
def some_func(a: t.Sized):
for i in a: print(i)
print(len(a))
已解决: 使用 typing.Sequence .
相关阅读: https://stackoverflow.com/questions/49427944/typehints-for-sized-iterable-in-python
因重构 (重命名) 导致疑似关联的命名被误修改 | pycharm; refactor
例如, class A 有一个 foo 方法, class B 也有一个 foo 方法. 在稍微复杂一些的导入和调用中, 通过 pycharm 的重构功能对 A.foo 重命名, 会牵连到 B 的实例的 foo 调用也被修改!
pycharm 控制台对 input 光标处理问题 | pycharm; terminal
在控制台触发 input 的时候, 有时候打出成对括号 (pycharm 会自动补充右括号, 并把光标置入括号内), 再往括号里写字母, 会出现第一个键入的字母滞留在屏幕上, 实际却没有录入进去的问题.
Callable 对函数的私有属性无法识别 | typehint
from typing import Callable
def xxx(func: Callable) -> None:
_ = func.__code__.co_argcount
相关阅读:
- https://stackoverflow.com/questions/37835179/how-can-i-specify-the-function-type-in-my-type-hints
使用到海象运算符和字典取值, 可能出现一个奇怪的弱警告 | pycharm; typehint
a = {'a': 1, 'b': 2, 'c': 3}
if (x := a['c']) and x > 1:
print(x)
重写 shelve 关闭方法, 导致内建函数 open 出现异常 | open
复现代码:
import shelve
class MyShelve(shelve.Shelve):
def close(self):
super().close()
with open('result.txt', 'w') as f:
f.write('program finished at {time}.'.format(time=...))
类型提示丢失的问题 | pycharm
在大型项目中可能会遇到, 例如重启 pycharm 后, 对源代码做整体检查. pycharm 会把所有原先写好的类型提示 (加入开发者定义了很多自定义类型, 并且做了多模块切分) 全部标为 “无法判断”.
这种情况比较少见, 一般通过格式化代码, 或者在编辑时随便加几个空格, 重新激活 lint 审查就恢复了.
self 无法在海象运算符中使用 | 海象运算符
class AAA:
def xxx(self):
a = {
'aaa': (self.value := True),
}
有 for-else, 但没有 for-elif-else | syntax
后注: 这个从语法设计角度来考虑不是问题, 有这个疑问是提问者欠成熟的考虑.
|