python / python/mypy

Add typed attribute to third party class.

Aperta
#9,823 1 commento 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

feature
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Feature

I would like to be able to add a (typed) attribute to a third-party class instance.

To give a specific example, Flask's current_app, and Flask-AppBuilder. Some example code:

    def my_view(self):
        reveal_type(current_app.appbuilder)
        if current_app.appbuilder.sm.has_access(...):
            ...

The reveal_type here shows Any: airflow/www/views.py:850: note: Revealed type is 'Any'

Things I tried:

  1. To add a typed attribute myself:

    if TYPE_CHECKING:
        current_app.appbuilder = AppBuilder(None)
        reveal_type(current_app.appbuilder)
    

    Didn't work: airflow/www/views.py:115: note: Revealed type is 'Any'

  2. A partial type stub file

    I could use stubgen etc to create a stub file for all of flask and then edit the type in flask.globals, but this presents a maintenance burden that I don't want (keeping it in sync).

    I searched for any way I could to have a "partial" stub file -- if I could have a stubs/flask/globals.pyi with out neededing all the rest of the type stubs for this module, but couldn't get it working - likely not supported.

Pitch

I don't know what the feature would look like, but for the flask ecosystem it is fairly common to add properties on to the global flask object, or the g global variable, and I would love to be able to type-check my use of them, without needing to cast it at each use.

This issue is mostly a request for help/ "is there any sensible way of doing this?"

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 riproducendo i risultati di reveal_type in airflow/www/views.py:850 e il tentativo con TYPE_CHECKING intorno alla riga 115. Esamina come i tipi di Flask's flask.globals e stubgen gestiscono gli attributi di terze parti. Il lavoro sarà considerato completato quando l'issue avrà un approccio documentato e manutenibile oppure una funzionalità del type-checker chiaramente circoscritta per tipizzare tali attributi senza uno stub sostitutivo completo.

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

Valutazione

Stack tecnologico
flask, python
Ambito
tooling
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.