Require argument names to match in Protocol
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Feature
Currently mypy does not check that argument names in functions that implement protocols match the argument names in the protocol. This fails when arguments are passed as keywords.
For example, this passes mypy:
from typing import Protocol
class MyProtocol(Protocol):
def foo(self, a: int) -> None: ...
class MyObject:
def foo(self, b: int) -> None:
pass
def call_foo(obj: MyProtocol) -> None:
obj.foo(a=1)
call_foo(MyObject())
but fails at runtime:
Traceback (most recent call last):
File "/Users/sidharthkapur/protocol_test.py", line 13, in <module>
call_foo(MyObject())
File "/Users/sidharthkapur/protocol_test.py", line 11, in call_foo
obj.foo(a=1)
TypeError: MyObject.foo() got an unexpected keyword argument 'a'
Pitch
If we checked this in mypy, we could prevent runtime errors like the one above.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el reproductor de Protocol y MyObject de la issue y pásalo por mypy para confirmar el comportamiento actual. Sigue las comprobaciones de compatibilidad de la implementación de Protocol y añade cobertura para nombres de argumentos que no coinciden y llamadas con palabras clave; el trabajo está terminado cuando mypy rechaza la implementación incompatible y conserva las implementaciones válidas de Protocol.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100