【问题标题】:Python arguments used in __getitem__? [duplicate]__getitem__ 中使用的 Python 参数? [复制]
【发布时间】:2021-04-22 04:07:29
【问题描述】:
class test:
    def func(self, *index): return index
    def __getitem__(self, *index): return index

t = test()

print(t.func(1))       # (1,)
print(t.func(1, 2))    # (1, 2)
print(t.func(1, 2, 3)) # (1, 2, 3)

到目前为止如此一致。

print(t[1])            # (1,)
print(t[1, 2])         # ((1, 2),)
print(t[1, 2, 3])      # ((1, 2, 3),)

但是现在 1 个参数调用不同。这使得很难使用“len(index)”来询问输入计数。


问:有没有办法询问索引器中包含了多少参数?

例如,t[1] 有 1 个值,t[1, 2] 有 2 个值,t[1, 2, 3] 有 3 个值。



A:(因为它已经关闭)

__getitem__ 总是接收 1 个参数。因此使用 'args' 而不是 '*args' 更清楚。

这决定了方括号中包含多少参数。

class test:
    def __getitem__(self, index): return len(index) if type(index) == tuple else 1

t = test()
print(t[1])       # 1
print(t[1, 2])    # 2
print(t[1, 2, 3]) # 3

Answer 使用来自“juanpa.arrivillaga”和“ekhumoro”的信息。

【问题讨论】:

  • 您到底想调用len 什么?您究竟应该使用什么索引符号来建模?
  • 不要使用*args。像这样定义它:def __getitem__(self, key):。 Python 将自动转换参数以正确处理切片等。然后您可以使用isinstance 来检查传入的内容。
  • 谢谢@ekhumoro

标签: python parameters arguments tuples


【解决方案1】:

您从根本上误解了 __getitem__ 的工作原理。它总是接收一个单个参数,使*args变得不必要和混乱,因为arg总是len(arg) == 1

注意,您使用的不是数组,而是tuple 对象。在第一种情况下,int 对象。

t[1]

传递 __getitem__ 一个 int,因为 1 是一个 int。

t[1, 2]

__getitem__ 传递给单个tuple,因为1, 2 是一个元组。

如果您想将单元素元组传递给__getitem__,您需要:

t[1,]

注意,__getitem__ 的唯一特殊情况语法是 slice,其中:

t["start":"stop":"step"]

变成一种slice 对象字面量,所以参数是:

slice('start', 'stop', 'step')

同样,

t["start":"stop":"step", 1:2]

将是 tupleslice 对象,所以:

(slice('start', 'stop', 'step'), slice(1, 2, None))

TLDR:

有没有办法询问索引器中包含了多少参数?

没有必要,因为**总会有一个参数传递给__getitem__*。您需要该参数的 type,随后可能还需要该对象的 length

【讨论】:

  • 查看我的答案和对问题措辞的更改,我不得不将其放在问题的末尾,使用“args”而不是“*args”确实更清楚。它并不完美,但在大多数情况下它应该可以工作。
  • @alan2here 为什么你仍然坚持谈论它传递了多少个参数? 总是有一个参数.
  • 我试图将其改写为关于调用方括号中包含多少逗号分隔值。
猜你喜欢
  • 1970-01-01
  • 2020-08-22
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 2011-12-10
  • 2023-03-04
相关资源
最近更新 更多