IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python 语言在实际使用中遇到的一些缺点和不足 -> 正文阅读

[Python知识库]Python 语言在实际使用中遇到的一些缺点和不足

综合影响范围和影响程度降序排列.

TypedDict 在描述较复杂的嵌套字典时表现乏力 | typehint

主要表现为:

  • 书写顺序混乱
  • (pycharm) 对值的类型判断存在问题, 特别是处理后向引用时
  • 结构可读性差

示例:

open 函数的 encoding 默认值不是 ‘utf-8’ | builtins; open

略.

报错定位不够精确 | exception

例如 KeyError, IndexError, AssertionError 在错误发生时, 如果不进行完整的捕获, 无法直接看到自己最关心的变量的值是什么.


assert filename.endswith('.jpg')
#      ~~~~~~~~ 我想在 AssertionError 发生时, 也告诉我 `filename` 的值是多少.

x = somevar[0][1]
#          ~~~~~~ 无法确知是 `[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]()  # -> 9
n[0]()  # -> 0

# 补充解释: 我期望 `m[0]()` 得到的答复也是 0.

lambda 不支持多行表达式 | lambda

略.

pycharm 对 typing.TypedDict 的实例化写法支持度非常差 | pycharm; typehint

from typing import TypedDict

class T:
    FuncName = str    
    FuncInfo = TypedDict('FuncInfo', {
        'name': FuncName,
        #       ~~~~~~~~ 会弹出弱警告: "value must be a type"
    })

Iterable, Sized 二者不可得兼? | typehint

import typing as t

def some_func(a: t.Iterable[str]):
    for i in a: print(i)
    print(len(a))
#         ~~~~~~ expected type "Sized", got "Iterable[str]" instead!
import typing as t

def some_func(a: t.Sized):
    for i in a: print(i)
#   ~~~~~~~~~~ expected type "Iterable[str]", got "Sized" instead!
    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
#           ~~~~~~~~~~ cannot find reference '__code__' in '(...) -> Any'!

相关阅读:

  • 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:
#         ^ 在这个位置偶尔会出现一个让人无法理解的弱警告: UnresolvedReference.
    print(x)

重写 shelve 关闭方法, 导致内建函数 open 出现异常 | open

复现代码:

import shelve

class MyShelve(shelve.Shelve):

    def close(self):
        super().close()

        with open('result.txt', 'w') as f:
        #    ~~~~ NameError: name 'open' is not defined!
            f.write('program finished at {time}.'.format(time=...))

类型提示丢失的问题 | pycharm

在大型项目中可能会遇到, 例如重启 pycharm 后, 对源代码做整体检查. pycharm 会把所有原先写好的类型提示 (加入开发者定义了很多自定义类型, 并且做了多模块切分) 全部标为 “无法判断”.

这种情况比较少见, 一般通过格式化代码, 或者在编辑时随便加几个空格, 重新激活 lint 审查就恢复了.

self 无法在海象运算符中使用 | 海象运算符

class AAA:
    def xxx(self):
        a = {
            'aaa': (self.value := True),
            #       ~~~~ unresolved reference: 'self'!
        }

有 for-else, 但没有 for-elif-else | syntax

后注: 这个从语法设计角度来考虑不是问题, 有这个疑问是提问者欠成熟的考虑.

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-25 11:35:25  更:2022-05-25 11:35:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:26:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码