python / python/mypy

stubgen cannot infer precise literal string types from docstring

Aperta
#13,996 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

bug topic-stubgen
Lingua principale
Python
Stelle
20.6k
Fork
3.3k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

Bug Report

I'm using stubgen to generate pyi files for a python c extension module.
Some functions take arguments of type Literal["xxx", "yyy"]; such constraints are written in the docstring of those functions.
After stubgen, these annotations are missing; however this only happens when the arguments of Literal contain str or bytes type.
This problem can be reproduced using infer_sig_from_docstring (see below).

To Reproduce

from mypy.stubdoc import infer_sig_from_docstring

# literal int and bool works as expected
print(infer_sig_from_docstring("f(x: Literal[42]) -> None", "f"))
print(infer_sig_from_docstring("f(x: Literal[False]) -> None", "f"))

# doesn't work
print(infer_sig_from_docstring("f(x: Literal['4_2']) -> None", "f"))
print(infer_sig_from_docstring('f(x: Literal["4_2"]) -> None', "f"))
print(infer_sig_from_docstring("f(x: Literal[b'4_2']) -> None", "f"))
print(infer_sig_from_docstring('f(x: Literal[b"4_2"]) -> None', "f"))

Expected Behavior

[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[42]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[False]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal["4_2"]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal["4_2"]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[b"4_2"]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[b"4_2"]', default=False)], ret_type='None')]

Actual Behavior

[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[42]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type='Literal[False]', default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type=None, default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type=None, default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type=None, default=False)], ret_type='None')]
[FunctionSig(name='f', args=[ArgSig(name='x', type=None, default=False)], ret_type='None')]

Your Environment

  • Mypy version used: 0.982
  • Python version used: 3.10.8

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 dal punto di ingresso infer_sig_from_docstring segnalato e riproduci i sei esempi dell’issue. Traccia il modo in cui vengono analizzate le annotazioni Literal, quindi aggiungi la copertura per i valori string e bytes, in modo che le firme restituite preservino i tipi Literal attesi.

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

Valutazione

Stack tecnologico
python
Ambito
tooling
Tipo di issue
Bug
Difficoltà
2/5
Tempo stimato
1-3 ore
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.