瀏覽代碼

add tuple slice

blueloveTH 3 年之前
父節點
當前提交
645320eb2f
共有 2 個文件被更改,包括 13 次插入12 次删除
  1. 5 12
      src/pocketpy.h
  2. 8 0
      tests/_builtin_ty.py

+ 5 - 12
src/pocketpy.h

@@ -421,16 +421,16 @@ void __initializeBuiltinFunctions(VM* _vm) {
         return vm->PyInt(_self.size());
     });
 
-    _vm->bindMethod<1>("list", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
-        const PyVarList& _self = vm->PyList_AS_C(args[0]);
+    _vm->bindMethodMulti<1>({"list", "tuple"}, "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
+        bool list = args[0]->is_type(vm->_tp_list);
+        const PyVarList& _self = list ? vm->PyList_AS_C(args[0]) : vm->PyTuple_AS_C(args[0]);
 
         if(args[1]->is_type(vm->_tp_slice)){
             _Slice s = vm->PySlice_AS_C(args[1]);
             s.normalize(_self.size());
             PyVarList _new_list;
-            for(size_t i = s.start; i < s.stop; i++)
-                _new_list.push_back(_self[i]);
-            return vm->PyList(_new_list);
+            for(size_t i = s.start; i < s.stop; i++) _new_list.push_back(_self[i]);
+            return list ? vm->PyList(_new_list) : vm->PyTuple(_new_list);
         }
 
         int _index = (int)vm->PyInt_AS_C(args[1]);
@@ -469,13 +469,6 @@ void __initializeBuiltinFunctions(VM* _vm) {
         return vm->PyInt(_self.size());
     });
 
-    _vm->bindMethod<1>("tuple", "__getitem__", [](VM* vm, const pkpy::ArgList& args) {
-        const PyVarList& _self = vm->PyTuple_AS_C(args[0]);
-        int _index = (int)vm->PyInt_AS_C(args[1]);
-        _index = vm->normalized_index(_index, _self.size());
-        return _self[_index];
-    });
-
     /************ PyBool ************/
     _vm->bindStaticMethod<1>("bool", "__new__", CPP_LAMBDA(vm->asBool(args[0])));
 

+ 8 - 0
tests/_builtin_ty.py

@@ -77,6 +77,14 @@ assert l[1:4] == [2,3,4]
 assert l[-1:-3] == []
 assert l[-3:-1] == [2,3]
 
+l = (1,2,3,4)
+assert l[2] == 3
+assert l[-1] == 4
+assert l[:32] == (1,2,3,4)
+assert l[32:] == tuple([])
+assert l[1:4] == (2,3,4)
+assert l[-1:-3] == tuple([])
+assert l[-3:-1] == (2,3)
 
 l1 = [1];l2 = l1;l1.append(2);l3 = [1,1,2]
 assert l2[1] == 2