In Python 2.7, 3.4 e 3.5, grp.getgrgid
è in grado di accettare una stringa:Perché c'è un comportamento diverso da getpwuid e getgrgid?
from grp import getgrgid
print(getgrgid('0'))
Tuttavia, pwd.getpwuid
non può fare lo stesso:
from pwd import getpwuid
print(getpwuid('0'))
Traceback (most recent call last):
File "getpwuid_test.py", line 2, in <module>
print(getpwuid('0'))
TypeError: an integer is required
Questo perché all'interno Modules/pwdmodule.c
, getpwuid
usi PyNumber_ParseTuple
con un convertitore che utilizza PyNumber_Index
per ottenere un intero Python e che genera un'eccezione in caso di errore.
Tuttavia, in Modules/grpmodule.c
, grp_getgrgid
utilizza PyNumber_Long
(O PyNumber_Int
per un vecchio abbastanza Python) come una conversione prima, e, come dice la documentazione in https://docs.python.org/3/c-api/number.html, questo è l'equivalente di correre , che può convertire una stringa in un intero . Solo allora è dato a PyNumber_Index
, tramite una funzione di supporto _Py_Gid_Converter
Qual è la ragione di questa differenza? È una scelta deliberata basata su qualche storia?
Il comportamento di getgrgid
sembra più utile ed è strano che non si applichi a entrambe le funzioni. Questo comportamento indesiderato è getgrgid
o getpwuid
?
Questa è una buona domanda. Penso che potrebbe ottenere una risposta più ufficiale su [una delle mailing list ufficiali di Python] (https://www.python.org/community/lists/). Ciò potrebbe portare a ottenere uno dei due moduli con patch. La mailing list per lo sviluppo del codice core python è [python-dev] (https://mail.python.org/mailman/listinfo/python-dev) (gli sviluppatori principali sono lì, incluso Guido). – eestrada
Buon piano. Ho sollevato un problema di classe 'comportamentale' su https://bugs.python.org/issue26129 subito dopo averlo postato, ma hai ragione che dovrei chiedere l'elenco python-dev. –
Se fossi in te, scriverei semplicemente una patch con il comportamento più rilassato di 'pwd' e collegalo al ticket. È più probabile che venga modificato se il codice patch è già pronto per il merge. Inoltre, dubito che lo renderebbero più rigido per 'grp' poiché potrebbe esserci già un codice in the wild che dipende dal comportamento rilassato. Probabilmente dovresti aggiungere anche i test di regressione con la patch (per entrambi ['pwd'] (https://hg.python.org/cpython/file/default/Lib/test/test_pwd.py) e [' grp' ] (https://hg.python.org/cpython/file/default/Lib/test/test_grp.py) moduli). – eestrada