我理解此操作是将sth。(不是整数)转换为整数。我正确理解吗?
我尝试实现功能“ operator.index()”:
import operator
a = float (1.0)
print (a)
print (type (a))
print (type (operator.index (a)))
我期望:
1.0
<class 'float'>
<class 'integer'>
实际输出:
1.0
<class 'float'>
TypeError: 'float' object can not be interpreted as an integer
答案 0 :(得分:1)
__index__
仅用于无损将对象解释为整数索引值。来自documentation for the hook:
被调用以实现
operator.index()
,并且每当Python需要将数字对象无损地转换为整数对象时(例如在切片或内置的bin()
,hex()
和oct()
个函数)。此方法的存在指示数字对象是整数类型。必须返回一个整数。
即使浮点值的子集是整数,float
也不是整数类型。
在标准库中,当前只有int
和bool
类型实现该挂钩。该钩子存在于您自己的代码中的自定义类中,或在第3方库中定义的自定义类,可在对序列进行索引时使用。
它与__int__
不同,因为该钩子确实允许有损转换; int(3.9)
为您提供了3
,但您并不希望listobject[3.9]
能够正常工作(索引为3
或4
的元素应该返回什么?)。在建立索引时,不能使用int()
将浮点数强制转换为整数,也不能仅接受整个浮点数(这会造成不一致和混乱)。
如果您需要在自己的Python代码中支持任意类似int的类型,则只使用operator.index()
:
class SequenceObject:
# ...
def __getitem__(self, idx):
idx = operator.index(idx) # convert to a valid integer index value
# ...
__index__
特殊方法是通过PEP 357添加到Python的,因此您可以在切片和索引中使用numpy
项目整数(这是另一种类型),因此可以正常工作:
>>> import operator
>>> import numpy as np
>>> number1 = np.int8(1)
>>> type(number1)
<class 'numpy.int8'>
>>> type(operator.index(number1))
<class 'int'>
>>> l = [17, 42, 81]
>>> l[number1]
42
和__index__
允许您的类用于索引编制:
>>> class EnglishNumber:
... # lets pretend this is a number that automatically shows
... # as the English name, like the https://pypi.org/p/inflect would
... def __init__(self, name, value):
... self._value = value
... self._name = name
... def __repr__(self): return f"<EnglishNumber {self._name}>"
... def __str__(self): return self._name
... def __index__(self): return self._value
...
>>> number2 = EnglishNumber("two", 2)
>>> number2
<EnglishNumber two>
>>> operator.index(number2)
2
>>> l[number2]
81