python / python/cpython

Duck-typing in `inspect.getfile`

Aperta
#131,628 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

stdlib type-feature
Lingua principale
Python
Stelle
77.2k
Fork
35.9k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Running inspect.getsource(numpy.random.random_sample) yields

File ~\.conda\envs\sage-dev\Lib\inspect.py:943, in getfile(object)
    941 if iscode(object):
    942     return object.co_filename
--> 943 raise TypeError('module, class, method, function, traceback, frame, or '
    944                 'code object was expected, got {}'.format(
    945                 type(object).__name__))

since the cython function is not correct recognized as a "true" function (i.e. it is not derived from FunctionType). But since a Cython function correct provides __code__, all the information is actually there to properly get the source file.

Refs: https://github.com/cython/cython/blob/030e3886fa094ecae6121f8ccacaf814956dca5c/docs/src/userguide/limitations.rst#L34

While it is quite possible to emulate the interface of functions in Cython's own function type, and recent Cython releases have seen several improvements here, the "inspect" module does not consider a Cython implemented function a "function", because it tests the object type explicitly instead of comparing an abstract interface or an abstract base class. This has a negative impact on code that uses inspect to inspect function objects, but would require a change to Python itself.

and

At the very least, the inspect module should use more duck-typing internally. For example, consider this code from "getfile":

    if ismethod(object):

        object = object.__func__

    if isfunction(object):

        object = object.__code__

    if istraceback(object):

        object = object.tb_frame

    if isframe(object):

        object = object.f_code

    if iscode(object):

        return object.co_filename

Originally posted by @jdemeyer in #74257

Linked PRs
  • gh-131632

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con inspect.getfile e i controlli isfunction/iscode mostrati nell’issue. Confronta il modo in cui vengono gestiti gli oggetti che espongono code, quindi esamina la PR collegata gh-131632 prima di fare qualsiasi lavoro. Il lavoro è completato quando la funzione Cython segnalata può risolvere il proprio file sorgente senza compromettere il comportamento esistente di inspect.getfile.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
python
Ambito
devtools
Tipo di issue
Funzionalità
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.