python / python/mypy

Lambda as RHS for operator always gets inferred as Any

Ouverte
#5,843 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug priority-2-low topic-disallow-any
Langage dominant
Python
Étoiles
20.6k
Forks
3.3k
Métriques de merge des PR
Métriques de PR en attente

Description

When a lambda is given as the RHS in an operator (example uses >>, but also occurs with others), the lambda’s type is always inferred as Any. Whereas calling the operator function directly, or passing an explicit function, does not.

from typing import Callable, Generic, TypeVar

_T = TypeVar('_T')
_U = TypeVar('_U')

class A(Generic[_T]):
    _value: _T
    def __init__(self, val: _T) -> None: ...
    def __rshift__(self, f: Callable[[_T], _U]) -> _U: ...

def inc(x: int) -> int: ...

A(1) >> inc  # No error
A(1).__rshift__(lambda x: x + 1)  # No error
A(1) >> (lambda x: x + 1)
#        │         └ Expression has type "Any"
#        └ Expression type contains "Any" (has type Callable[[Any], Any])
  • Python 3.7.0
  • mypy 0.641
  • mypy config:
    [mypy]
    check_untyped_defs = True
    disallow_any_decorated = True
    disallow_any_expr = True
    disallow_any_unimported = True
    disallow_incomplete_defs = True
    disallow_subclassing_any = True
    disallow_untyped_calls = True
    disallow_untyped_decorators = True
    disallow_untyped_defs = True
    warn_return_any = True
    warn_unused_ignores = True
    

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Exécutez la reproduction Python fournie avec la configuration mypy indiquée et comparez la forme opérateur avec l’appel direct de la méthode et la fonction nommée. Suivez l’inférence de type de l’expression opérateur à partir de ce point d’entrée ; le travail est terminé lorsque la lambda entre parenthèses est déduite à partir du type de l’opérande au lieu de produire Any.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
compilers
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.