【发布时间】:2016-05-12 19:42:48
【问题描述】:
假设variable = None,如何以编程方式区分以下切片语法(效果相同)?
obj[variable:]
obj[variable:None]
obj[:variable]
obj[None:variable]
obj[:]
obj[::]
obj[None:None]
obj[None:None:None]
我正在尝试自定义我的类的__getitem__ 方法以[ab]使用切片语法进行高级索引(语法糖),并希望以不同的方式处理不同的切片语法,因为我需要很多语法糖......(这可能不是一个好习惯,但只是为了实验......)。
def __getitem__(self, slice_obj):
# slice_obj will be `slice(None, None, None)` for all
# `obj[variable:]`, `obj[:variable]` and `obj[:]`
我们可以看到使用dis库有不同的切片操作码:
https://docs.python.org/2/library/dis.html#opcode-SLICE+0
SLICE+0() 实现 TOS = TOS[:]。
SLICE+1() 实现 TOS = TOS1[TOS:]。
SLICE+2() 实现 TOS = TOS1[:TOS]。
SLICE+3() 实现 TOS = TOS2[TOS1:TOS]。
那么任何人都可以使用一些自省技巧来分辨不同的语法(inspect, dis, ast, 等)吗?
更多问题:
如何区分函数中传入的参数和默认参数?例如,
def add(x, delta=1):
return x + delta
在add函数内部,如何判断是add(x)还是add(x, 1)?
链接:
[我们可以为 slice 使用唯一的、不同的默认参数(除了 None)吗?]
https://docs.python.org/2/c-api/slice.html#c.PySlice_New http://www.boost.org/doc/libs/1_39_0/libs/python/doc/v2/object.html#slice_nil-spec
感谢任何 cmets/解决方法/黑客!
【问题讨论】:
-
感谢@chepner 指出。我正在尝试使用 slice 作为语法糖,我需要很多糖来表达不同的含义......我已经更新了我的问题以强调这一点。
-
非常小心地滥用标准语法 - 当您的切片/切块背叛正常使用时,确保您的 API 聪明超过任何用户认知失调,尤其是在刚刚弄清楚切片是什么的新 Python 用户中。此外,您的 API 将如何处理本身就是切片对象的单个参数?
标签: python indexing syntax slice default-arguments