loopylist 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- loopylist-1.0.0/PKG-INFO +18 -0
- loopylist-1.0.0/README.md +11 -0
- loopylist-1.0.0/loopylist.c +80 -0
- loopylist-1.0.0/loopylist.egg-info/PKG-INFO +18 -0
- loopylist-1.0.0/loopylist.egg-info/SOURCES.txt +7 -0
- loopylist-1.0.0/loopylist.egg-info/dependency_links.txt +1 -0
- loopylist-1.0.0/loopylist.egg-info/top_level.txt +1 -0
- loopylist-1.0.0/pyproject.toml +15 -0
- loopylist-1.0.0/setup.cfg +4 -0
loopylist-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: loopylist
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Natively patches standard Python lists with infinite indexing syntax.
|
|
5
|
+
Requires-Python: >=3.8
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
|
|
8
|
+
# loopylist
|
|
9
|
+
|
|
10
|
+
Natively patches standard Python lists with infinite indexing syntax. - Made by Alvin Nepal
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
```python
|
|
14
|
+
import loopylist
|
|
15
|
+
|
|
16
|
+
my_list = ["Apple", "Banana", "Orange"]
|
|
17
|
+
print(my_list.loopylist[67]) # Output: Banana
|
|
18
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#define PY_SSIZE_T_CLEAN
|
|
2
|
+
#include <Python.h>
|
|
3
|
+
|
|
4
|
+
static PyObject* LoopyProxy_getitem(PyObject* self, PyObject* index_obj) {
|
|
5
|
+
PyObject* orig_list = PyObject_GetAttrString(self, "_list");
|
|
6
|
+
if (!orig_list) return NULL;
|
|
7
|
+
|
|
8
|
+
Py_ssize_t len = PyList_Size(orig_list);
|
|
9
|
+
if (len == 0) {
|
|
10
|
+
PyErr_SetString(PyExc_IndexError, "Cannot loop over an empty list");
|
|
11
|
+
Py_DECREF(orig_list);
|
|
12
|
+
return NULL;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
Py_ssize_t idx = PyLong_AsSsize_t(index_obj);
|
|
16
|
+
if (PyErr_Occurred()) {
|
|
17
|
+
Py_DECREF(orig_list);
|
|
18
|
+
return NULL;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
Py_ssize_t mod_idx = idx % len;
|
|
22
|
+
if (mod_idx < 0) {
|
|
23
|
+
mod_idx += len;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
PyObject* item = PyList_GetItem(orig_list, mod_idx);
|
|
27
|
+
Py_XINCREF(item);
|
|
28
|
+
Py_DECREF(orig_list);
|
|
29
|
+
return item;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static PyMappingMethods LoopyProxy_mapping = {
|
|
33
|
+
.mp_subscript = LoopyProxy_getitem,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
static PyTypeObject LoopyProxyType = {
|
|
37
|
+
PyVarObject_HEAD_INIT(NULL, 0)
|
|
38
|
+
.tp_name = "loopylist.LoProxy",
|
|
39
|
+
.tp_basicsize = sizeof(PyObject) + sizeof(PyObject*),
|
|
40
|
+
.tp_flags = Py_TPFLAGS_DEFAULT,
|
|
41
|
+
.tp_as_mapping = &LoopyProxy_mapping,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
static PyObject* list_loopylist_getter(PyObject* self, void* closure) {
|
|
45
|
+
PyObject* proxy = LoopyProxyType.tp_alloc(&LoopyProxyType, 0);
|
|
46
|
+
if (proxy) {
|
|
47
|
+
Py_INCREF(self);
|
|
48
|
+
PyObject_SetAttrString(proxy, "_list", self);
|
|
49
|
+
}
|
|
50
|
+
return proxy;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
static PyModuleDef loopylistmodule = {
|
|
54
|
+
PyModuleDef_HEAD_INIT,
|
|
55
|
+
.m_name = "loopylist",
|
|
56
|
+
.m_size = -1,
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
PyMODINIT_FUNC PyInit_loopylist(void) {
|
|
60
|
+
PyObject* m = PyModule_Create(&loopylistmodule);
|
|
61
|
+
if (!m) return NULL;
|
|
62
|
+
|
|
63
|
+
if (PyType_Ready(&LoopyProxyType) < 0) return NULL;
|
|
64
|
+
|
|
65
|
+
static PyGetSetDef loopy_getset[] = {
|
|
66
|
+
{"loopylist", (getter)list_loopylist_getter, NULL, "Infinite list indexing", NULL},
|
|
67
|
+
{NULL}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
PyTypeObject* list_type = &PyList_Type;
|
|
71
|
+
if (list_type->tp_getset == NULL) {
|
|
72
|
+
list_type->tp_getset = loopy_getset;
|
|
73
|
+
} else {
|
|
74
|
+
PyErr_SetString(PyExc_RuntimeError, "Could not inject into native list descriptors");
|
|
75
|
+
return NULL;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
PyType_Modified(list_type);
|
|
79
|
+
return m;
|
|
80
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: loopylist
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Natively patches standard Python lists with infinite indexing syntax.
|
|
5
|
+
Requires-Python: >=3.8
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
|
|
8
|
+
# loopylist
|
|
9
|
+
|
|
10
|
+
Natively patches standard Python lists with infinite indexing syntax. - Made by Alvin Nepal
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
```python
|
|
14
|
+
import loopylist
|
|
15
|
+
|
|
16
|
+
my_list = ["Apple", "Banana", "Orange"]
|
|
17
|
+
print(my_list.loopylist[67]) # Output: Banana
|
|
18
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
loopylist
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "loopylist"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Natively patches standard Python lists with infinite indexing syntax."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
|
|
12
|
+
[tool.setuptools]
|
|
13
|
+
ext-modules = [
|
|
14
|
+
{ name = "loopylist", sources = ["loopylist.c"] }
|
|
15
|
+
]
|