return f'{cls.__name__}[{item.__name__}]'
self.assertEqual(Meta[int], 'Meta[int]')
- def test_class_getitem_metaclass_2(self):
+ def test_class_getitem_with_metaclass(self):
+ class Meta(type): pass
+ class C(metaclass=Meta):
+ def __class_getitem__(cls, item):
+ return f'{cls.__name__}[{item.__name__}]'
+ self.assertEqual(C[int], 'C[int]')
+
+ def test_class_getitem_metaclass_first(self):
class Meta(type):
def __getitem__(cls, item):
return 'from metaclass'
PyObject_GetItem(PyObject *o, PyObject *key)
{
PyMappingMethods *m;
+ PySequenceMethods *ms;
if (o == NULL || key == NULL) {
return null_error();
return item;
}
- if (o->ob_type->tp_as_sequence) {
+ ms = o->ob_type->tp_as_sequence;
+ if (ms && ms->sq_item) {
if (PyIndex_Check(key)) {
Py_ssize_t key_value;
key_value = PyNumber_AsSsize_t(key, PyExc_IndexError);
return NULL;
return PySequence_GetItem(o, key_value);
}
- else if (o->ob_type->tp_as_sequence->sq_item)
+ else {
return type_error("sequence index must "
"be integer, not '%.200s'", key);
+ }
}
if (PyType_Check(o)) {