est ici la source de C pour builtin de Python ord
du current SVN revision of bltinmodule.c. En ce qui concerne
static PyObject *
builtin_ord(PyObject *self, PyObject* obj)
{
long ord;
Py_ssize_t size;
if (PyString_Check(obj)) {
size = PyString_GET_SIZE(obj);
if (size == 1) {
ord = (long)((unsigned char)*PyString_AS_STRING(obj));
return PyInt_FromLong(ord);
}
} else if (PyByteArray_Check(obj)) {
size = PyByteArray_GET_SIZE(obj);
if (size == 1) {
ord = (long)((unsigned char)*PyByteArray_AS_STRING(obj));
return PyInt_FromLong(ord);
}
#ifdef Py_USING_UNICODE
} else if (PyUnicode_Check(obj)) {
size = PyUnicode_GET_SIZE(obj);
if (size == 1) {
ord = (long)*PyUnicode_AS_UNICODE(obj);
return PyInt_FromLong(ord);
}
#endif
} else {
PyErr_Format(PyExc_TypeError,
"ord() expected string of length 1, but " \
"%.200s found", obj->ob_type->tp_name);
return NULL;
}
PyErr_Format(PyExc_TypeError,
"ord() expected a character, "
"but string of length %zd found",
size);
return NULL;
}
Comme vous pouvez le voir, il ne fait pas de méthode fait appel à l'instance que vous passez que je peux dire, Si vous ne lui passez pas une chaîne explicite, il n'y a aucun moyen de remplacer la fonctionnalité de ord
. En fait, il vérifie essentiellement que PyObject est soit une chaîne, un tableau d'octets, soit un Unicode - c'est ce que font les fonctions PyString_Check, etc. Si ce n'est pas le cas, vous obtenez l'exception TypeError.
Une solution qui ne serait pas à l'échelle très bien d'écrire votre propre ord
dans l'espace de noms global:
>>> class STR(str):
... def __int__(self):
... return 42
...
>>>
>>> def ord(s):
... if isinstance(s, STR):
... return int(s)
... else:
... return __builtins__.ord(s)
...
>>>
>>> ord(STR('fdsafds'))
42
>>> ord("!")
33
Bien sûr, cette échelles horriblement parce qu'un autre module en utilisant votre classe peut être appeler directement __builtins__.ord
, ou ils pourraient même écraser ord
eux-mêmes! Mais, si vous avez seulement besoin de cela pour travailler sur un seul module autonome, c'est une façon de s'y prendre.
J'aime cette réponse. Quel est le problème d'échelle? Je ne peux pas le voir très bien. –