Py学习  »  user2357112  »  全部回复
回复总数  6
5 年前
回复了 user2357112 创建的主题 » Python如何散列itertools。count()?

它只是继承了基于身份的默认设置 __hash__ 和 __eq__ 从…起 object .

引用 docs 对于 tp_hash :

继承:

分组:tp_hash,tp_richcompare

此字段由子类型与tp_richcompare一起继承:当子类型tp_richcompare和tp_hash都为空时,子类型同时继承tp_richcompare和tp_hash。

自从 tp_散列 和 tp_richcompare 都静态初始化为 0 , PyType_Ready 将 copy those fields 来自基类,默认为 对象 .

7 年前
回复了 user2357112 创建的主题 » python:如何输入提示类变量?

一种暗示 SomeClass 意味着值应该是 某个阶级 ,不是类变量 某个阶级 “。”什么之中的一个 某个阶级 's class variables“不是一个类型,并且没有可用于该含义的注释。

这种情况的stdlib解决方案是 enum.Enum ,但你拒绝了。在这种情况下,接下来最好的事情是 typing.Literal 类型,在Python3.8中引入。有了它,你可以写

SomeClassValue = typing.Literal['regular', 'important', 'accounts', 'special']

def do_something(*, queue_name: SomeClassValue):
    ...

你 不能 以某种方式从 某个阶级 ;它可能会运行,但不会键入check。这意味着如果你走这条路,你将不得不有很多容易出错的代码重复。(另外,您可能需要 Literal 类变量上的注释-我不知道将为这些变量推断什么类型。)

9 年前
回复了 user2357112 创建的主题 » python中意外的多运算符行为[重复]

这是一个链式的比较。你可能知道你可以

1 < 2 < 3

在python中,它相当于 (1 < 2) and (2 < 3) . (或许你没有,现在你知道了)同样的事情也适用于 in 和 == .

5 in [1, 2, 3, 4] == False

相当于

(5 in [1, 2, 3, 4]) and ([1, 2, 3, 4] == False)

自从 [1, 2, 3, 4] 不等于 False ,整个表达式的计算结果为 假 .

7 年前
回复了 user2357112 创建的主题 » python内部实现[复制]

在c python中,许多模块是用c实现的,而不是用python。你可以在里面找到那些 Modules/ ,而纯python则位于 Lib/ .

在某些情况下(例如 json module),python源代码自己提供模块,只有在c模块可用时才使用它(以提高性能)。对于其余的模块,您可以查看 PyPy's implementations .

简单地说,你就是做不到。

如上所述 Documentation ,

可以使用具有多个时隙父类的多重继承,但仅允许一个父类具有由时隙创建的属性(其他基必须具有空的时隙布局)-冲突会引发类型错误。

背后的想法 __slots__ 是为了保留特定的 槽 对于实例的内存布局中的每个属性。 A 和 B 正在尝试为 slot1 和 slot2 属性,以及 C 不能为两个属性保留相同的内存。只是不兼容。


感谢注释中的jcode,下面的方法被修改为正确的。

但总有一种方法,我个人更喜欢使用包含所有必需插槽的公共基 斯洛茨基 当存在多个继承类时是必需的。

import pympler.asizeof
class base():
    __slots__ = ['a','b']

class A(base):
    __slots__ = []

class B(base):
    __slots__ = []

class C(A,B):
    __slots__ = []

class D():
    pass

#Update
bb = base()
bb.a = 100
bb.b = 100
print(pympler.asizeof.asizeof(bb))
a = A()
a.a = 100
a.b = 100
print(pympler.asizeof.asizeof(a))
c = C()
c.a = 100
c.b = 100
print(pympler.asizeof.asizeof(c))
d = D()
d.a = 100
d.b = 100
print(pympler.asizeof.asizeof(d))

更新 这4个值是88,88,88,312。虽然 斯洛茨基 保留的。

7 年前
回复了 user2357112 创建的主题 » 无意中重写Python2.7标准模块-如何防止?

当它说“内置模块”时,这行文档指的是直接编译到python可执行文件中的模块。你可以看到里面有哪些 sys.builtin_module_names .

您需要做的是关闭隐式相对导入,这可以在每个文件的基础上使用 absolute_import 未来声明:

from __future__ import absolute_import