blueloveTH 1 год назад
Родитель
Сommit
e4c8c47c2e
2 измененных файлов с 38 добавлено и 31 удалено
  1. 8 3
      src/public/py_list.c
  2. 30 28
      tests/05_list.py

+ 8 - 3
src/public/py_list.c

@@ -237,7 +237,6 @@ static bool _py_list__count(int argc, py_Ref argv) {
     return true;
     return true;
 }
 }
 
 
-
 static bool _py_list__clear(int argc, py_Ref argv) {
 static bool _py_list__clear(int argc, py_Ref argv) {
     PY_CHECK_ARGC(1);
     PY_CHECK_ARGC(1);
     py_list__clear(py_arg(0));
     py_list__clear(py_arg(0));
@@ -255,8 +254,13 @@ static bool _py_list__copy(int argc, py_Ref argv) {
 }
 }
 
 
 static bool _py_list__index(int argc, py_Ref argv) {
 static bool _py_list__index(int argc, py_Ref argv) {
-    PY_CHECK_ARGC(2);
-    for(int i = 0; i < py_list__len(py_arg(0)); i++) {
+    if(argc > 3) return TypeError("index() takes at most 3 arguments");
+    int start = 0;
+    if(argc == 3) {
+        PY_CHECK_ARG_TYPE(2, tp_int);
+        start = py_toint(py_arg(2));
+    }
+    for(int i = start; i < py_list__len(py_arg(0)); i++) {
         int res = py_eq(py_list__getitem(py_arg(0), i), py_arg(1));
         int res = py_eq(py_list__getitem(py_arg(0), i), py_arg(1));
         if(res == -1) return false;
         if(res == -1) return false;
         if(res) {
         if(res) {
@@ -301,6 +305,7 @@ static bool _py_list__pop(int argc, py_Ref argv) {
     c11_vector__pop(self);
     c11_vector__pop(self);
     return true;
     return true;
 }
 }
+
 static bool _py_list__insert(int argc, py_Ref argv) {
 static bool _py_list__insert(int argc, py_Ref argv) {
     PY_CHECK_ARGC(3);
     PY_CHECK_ARGC(3);
     PY_CHECK_ARG_TYPE(1, tp_int);
     PY_CHECK_ARG_TYPE(1, tp_int);

+ 30 - 28
tests/05_list.py

@@ -20,6 +20,7 @@ l1 = [1];l2 = l1;l1.append(2);l3 = [1,1,2]
 assert l2[1] == 2
 assert l2[1] == 2
 assert l1 == l2
 assert l1 == l2
 assert l1*3 == [1,2,1,2,1,2]
 assert l1*3 == [1,2,1,2,1,2]
+assert 2*l1 == [1,2,1,2]
 assert l3.count(1) == 2
 assert l3.count(1) == 2
 
 
 member = ['Tom', 'Sunny', 'Honer', 'Lily']
 member = ['Tom', 'Sunny', 'Honer', 'Lily']
@@ -55,27 +56,7 @@ l.insert(1, 'e')
 assert l == ['h', 'e', 'l', 'l', 'o']
 assert l == ['h', 'e', 'l', 'l', 'o']
 assert l[-2] == 'l'
 assert l[-2] == 'l'
 
 
-# test sort
-a = [8, 2, 4, 2, 9]
-assert sorted(a) == [2, 2, 4, 8, 9]
-assert sorted(a, reverse=True) == [9, 8, 4, 2, 2]
-
-assert sorted(a, key=lambda x:-x, reverse=True) == [2, 2, 4, 8, 9]
-assert a == [8, 2, 4, 2, 9]
-
-b = [(1, 2), (3, 3), (5, 1)]
-b.sort(key=lambda x:x[1])
-assert b == [(5, 1), (1, 2), (3,3)]
-
-# unpacking builder
-a = [1, 2, 3]
-b = [*a, 4, 5]
-assert b == [1, 2, 3, 4, 5]
-
-a = []
-b = [*a, 1, 2, 3, *a, *a]
-assert b == [1, 2, 3]
-
+b = [1, 2, 3]
 assert b[
 assert b[
     1
     1
 ] == 2
 ] == 2
@@ -87,12 +68,6 @@ assert b[0] == 1
 assert b[
 assert b[
     0] == 1
     0] == 1
 
 
-a = []
-a.append(0)
-a.append([1, 2, a])
-
-assert repr(a) == "[0, [1, 2, [...]]]"
-
 a = [1, 2, 3]
 a = [1, 2, 3]
 assert a.index(2) == 1
 assert a.index(2) == 1
 assert a.index(1) == 0
 assert a.index(1) == 0
@@ -110,6 +85,24 @@ assert list(range(1, 5, 2)) == [1, 3]
 assert list(range(5, 1, -1)) == [5, 4, 3, 2]
 assert list(range(5, 1, -1)) == [5, 4, 3, 2]
 assert list(range(5, 1, -2)) == [5, 3]
 assert list(range(5, 1, -2)) == [5, 3]
 
 
+# test sort
+a = [8, 2, 4, 2, 9]
+assert sorted(a) == [2, 2, 4, 8, 9]
+assert sorted(a, reverse=True) == [9, 8, 4, 2, 2]
+
+assert sorted(a, key=lambda x:-x, reverse=True) == [2, 2, 4, 8, 9]
+assert a == [8, 2, 4, 2, 9]
+
+b = [(1, 2), (3, 3), (5, 1)]
+b.sort(key=lambda x:x[1])
+assert b == [(5, 1), (1, 2), (3,3)]
+
+# test cyclic reference
+a = []
+a.append(0)
+a.append([1, 2, a])
+
+assert repr(a) == "[0, [1, 2, [...]]]"
 
 
 # try:
 # try:
 #     a.index(1, 1)
 #     a.index(1, 1)
@@ -129,4 +122,13 @@ assert list(range(5, 1, -2)) == [5, 3]
 # assert A()[::, :] == (slice(None, None, None), slice(None, None, None))
 # assert A()[::, :] == (slice(None, None, None), slice(None, None, None))
 # assert A()[::, :2] == (slice(None, None, None), slice(None, 2, None))
 # assert A()[::, :2] == (slice(None, None, None), slice(None, 2, None))
 # assert A()['b':'c':1, :] == (slice('b', 'c', 1), slice(None, None, None))
 # assert A()['b':'c':1, :] == (slice('b', 'c', 1), slice(None, None, None))
-# assert A()[1:2, :A()[3:4, ::-1]] == (slice(1, 2, None), slice(None, (slice(3, 4, None), slice(None, None, -1)), None))
+# assert A()[1:2, :A()[3:4, ::-1]] == (slice(1, 2, None), slice(None, (slice(3, 4, None), slice(None, None, -1)), None))
+
+# unpacking builder (not supported)
+# a = [1, 2, 3]
+# b = [*a, 4, 5]
+# assert b == [1, 2, 3, 4, 5]
+
+# a = []
+# b = [*a, 1, 2, 3, *a, *a]
+# assert b == [1, 2, 3]