有人可以举一个“ operator.index()”的例子吗?

时间:2019-01-26 19:17:08

标签: python python-3.x

我理解此操作是将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

1 个答案:

答案 0 :(得分:1)

__index__仅用于无损将对象解释为整数索引值。来自documentation for the hook

  

被调用以实现operator.index(),并且每当Python需要将数字对象无损地转换为整数对象时(例如在切片或内置的bin()hex()oct()个函数)。此方法的存在指示数字对象是整数类型。必须返回一个整数。

即使浮点值的子集是整数,float也不是整数类型。

在标准库中,当前只有intbool类型实现该挂钩。该钩子存在于您自己的代码中的自定义类中,或在第3方库中定义的自定义类,可在对序列进行索引时使用。

它与__int__不同,因为该钩子确实允许有损转换; int(3.9)为您提供了3,但您并不希望listobject[3.9]能够正常工作(索引为34的元素应该返回什么?)。在建立索引时,不能使用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