wln*_*ana 2 python internals abstract-syntax-tree
>>> parseprint("l[1:2, 3]")
Module(body=[
Expr(value=Subscript(value=Name(id='l', ctx=Load()), slice=ExtSlice(dims=[
Slice(lower=Num(n=1), upper=Num(n=2), step=None),
Index(value=Num(n=3)),
]), ctx=Load())),
])
Run Code Online (Sandbox Code Playgroud)
但是,此语法在交互式python shell中不起作用:
>>> foo = range(10)
>>> foo[1:2,3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple
Run Code Online (Sandbox Code Playgroud)
有人知道如何使用此功能吗?
相关讨论:
该语法在shell中运行良好,只是list
对象不支持扩展切片。您尝试过的结果是一个TypeError
,而不是一个SyntaxError
。
许多Numpy数组类型都可以;该项目有助于驱动扩展的切片语法。Numpy数组使用扩展切片来解决多维数组的不同维度。有关它们如何使用语法的详细信息,请参见Numpy Indexing一章。
扩展切片在“ 订阅”部分中明确记录,AST节点对extended_slicing
术语进行编码:
extended_slicing ::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= expression | proper_slice | ellipsis
proper_slice ::= short_slice | long_slice
Run Code Online (Sandbox Code Playgroud)
但是,Python标准库自身中没有使用扩展切片的类型。
您可以轻松地构建自己的类来接受扩展切片。只希望在您的object.__getitem__()
方法实现中处理一个元组:
>>> class Foo(object):
... def __getitem__(self, item):
... return item
...
>>> foo = Foo()
>>> foo[1, 2:3]
(1, slice(2, 3, None))
Run Code Online (Sandbox Code Playgroud)
的每个元素slice_list
成为元组中的一个对象,并以- :
分隔的切片索引作为slice()
实例传递。