小编Mec*_*Pig的帖子

为什么Python3.10中type没有__class_getitem__方法或__getitem__方法?

参考Python文档__class_getitem__

\n
\n

一个类通常只有在定义了特殊的类方法时才可以被参数化__class_getitem__()

\n
\n

输入

\n
\n

自 3.9 版起已弃用: builtins.type现在支持[]. 请参阅PEP 585通用别名类型

\n
\n

这意味着在3.9版本之后,我们可以使用type[class]代替typing.Type[class],但是在pycharm中,当我使用前者时,IDE告诉我:

\n
\n

typeundefined __getitem__,因此,[]不能在其实例上使用该运算符。

\n
\n

我在交互式 Python 中证实了这一点:

\n
Python 3.10.5 (tags/v3.10.5:f377153, Jun  6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32\nType "help", "copyright", "credits" or "license" for more information.\n>>> list[int]\nlist[int]\n>>> list.__class_getitem__(int)\nlist[int]\n>>> type[int]\ntype[int]\n>>> type.__class_getitem__(int)\nTraceback (most recent …
Run Code Online (Sandbox Code Playgroud)

python typing magic-methods

5
推荐指数
0
解决办法
3459
查看次数

为什么我们可以继承`typing.NamedTuple`?

Python 3.6之后,我们有了typing.NamedTuple,它是 的类型化版本collections.namedtuple(),我们可以像类一样继承它:

class Employee(NamedTuple):
    name: str
    id: int
Run Code Online (Sandbox Code Playgroud)

相比之下collections.namedtuple,这个语法更漂亮,但是我还是看不懂它的实现,无论是看typing.py文件,还是做一些简单的测试,我们都会发现它是一个函数而不是一个类:

# Python 3.10.6 typing.py
def NamedTuple(typename, fields=None, /, **kwargs):
    """..."""
    if fields is None:
        fields = kwargs.items()
    elif kwargs:
        raise TypeError("Either list of fields or keywords"
                        " can be provided to NamedTuple, not both")
    try:
        module = sys._getframe(1).f_globals.get('__name__', '__main__')
    except (AttributeError, ValueError):
        module = None
    return _make_nmtuple(typename, fields, module=module)
Run Code Online (Sandbox Code Playgroud)
>>> type(NamedTuple)
<class 'function'>
Run Code Online (Sandbox Code Playgroud)

我知道它使用了一些元类魔法,但我不明白使用时会发生什么class MyClass(NamedTuple)。为此,我尝试自定义一个函数来继承:

>>> def func_for_inherit(*args, **kwargs):
... …
Run Code Online (Sandbox Code Playgroud)

python namedtuple python-typing

4
推荐指数
1
解决办法
686
查看次数

Python:连接字符串列表的所有第一个元素,字符串列表的第二个元素等

输入是嵌套的字符串列表,输出应该是连接输入字符串的第一个元素、所有输入字符串的第二个元素的字符串列表,依此类推。

inputList = [["o" , "t" ,"t", "", "",""],["n", "w", "hr", "", ""],["e", "o", "e", ""],["", "", "e", ""]]
outputList = ['one', 'two', 'three', '', '']
Run Code Online (Sandbox Code Playgroud)

我就是这么强行逼出来的。

listStr = ["", "", "", "", ""]
for i in range(0,len(IN)):
    for j in range(0,len(IN)):
        listStr[i] += IN[j][i]
Run Code Online (Sandbox Code Playgroud)

有什么更好的时间复杂度和空间复杂度来获得所需输出而不是暴力破解的更好方法?

python

0
推荐指数
1
解决办法
110
查看次数