Rhino Python脚本:字符串切片end=0失效的原因与修复方案
问题原因与解决方法
原代码的两个核心问题
函数调用错误:
rs.GetInteger是用于获取整数输入的函数,你没有加括号调用(正确写法是rs.GetInteger()),这会导致start和end被赋值为函数对象,而非你实际输入的整数值,后续执行字符串切片时会直接抛出类型错误。切片逻辑不符合需求:当你输入
end=0时,代码里end = -end计算后还是0。在Python字符串切片语法中,name[start:0]表示从start索引位置截取到索引0的位置(不包含该位置),如果start是正数(比如示例中的5),这是一个反向的无效区间,会返回空字符串,完全不符合你想要截取到字符串末尾的需求。
举个实际例子:对象名称是123456789,输入start=5、end=0,原代码(假设修复了函数调用问题)执行name[5:0],结果是空,而不是你预期的6789。
解决方法
针对上述两个问题,我们需要做两处修改:
- 给
rs.GetInteger加上括号,确保调用函数获取输入的整数值; - 将输入的0转换成
None,因为Python切片中,None在start位置表示从开头截取,在end位置表示截取到末尾。
修改后的正确代码如下:
start = rs.GetInteger() if start == 0: start = None end = rs.GetInteger() end = -end if end == 0: end = None objectIDs = rs.GetObjects("Pick some object") for singleID in objectIDs: name = rs.ObjectName(singleID) name = name[start:end] rs.ObjectName(singleID, name)
代码逻辑说明
- 当输入
start=0时,将start设为None,此时name[None:end]等价于name[:end],对应示例中输入0和4得到12345的需求(end=-4,name[:-4]正好是前5个字符)。 - 当输入
end=0时,将end设为None,此时name[start:None]等价于name[start:],对应示例中输入5和0得到6789的需求(从索引5开始截取到末尾)。
内容的提问来源于stack exchange,提问作者user20406817
相关产品推荐
相关产品推荐

