2016-01-15 8 views
7

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?

+2

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

+2

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. –

+0

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

risposta

0

La risposta breve è perché gli umani sono fallibili e gli errori accadono. Alcuni sono doozies e get noticed quickly, altri sono minori e possono andare anni senza rilevamento.

Grazie per aver contribuito a migliorare Python!

Problemi correlati