TYPE_CHECKING in ternary expression

Offen
#15,856 0 Kommentare 7 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
35/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
python
Bereich
devtools

Rechercherichtung

Reproduzieren Sie zunächst beide Python-Beispiele mit mypy und vergleichen Sie, wie TYPE_CHECKING im ternären Ausdruck im Vergleich zur if/else-Form behandelt wird. Verfolgen Sie den Einstiegspunkt der Typprüfung des ternären Ausdrucks, um festzustellen, ob das Verhalten ein Fehler ist oder dokumentiert werden sollte. Erledigt ist die Aufgabe, wenn das Beispiel korrekt validiert wird oder das unterschiedliche Verhalten klar dokumentiert ist, mit Regressionstests, falls sich das Verhalten ändert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

documentation topic-ternary-expression

This issue should be marked with "topic-ternary-expression" label.

Mypy doesn't understand TYPE_CHECKING checked in a ternary expression.

Example 1
from typing import TYPE_CHECKING

from redis.asyncio import ConnectionPool
from redis.asyncio import Redis as OGRedis

from . import settings

Redis = OGRedis[bytes] if TYPE_CHECKING else OGRedis  # Redis is Generic in stubs


async def func() -> None:
    connection_pool = ConnectionPool.from_url(settings.redis_url)
    async with Redis(connection_pool=connection_pool) as redis:
        await redis.set(
            name="test",
            value="Hello World",
        )
$ mypy project/
project/code.py:13: error: "object" has no attribute "__aenter__"  [attr-defined]
project/code.py:13: error: "object" has no attribute "__aexit__"  [attr-defined]
Found 2 errors in 1 file (checked 3 source files)
Example 2
from typing import TYPE_CHECKING

from redis.asyncio import ConnectionPool
from redis.asyncio import Redis as OGRedis

from . import settings

if TYPE_CHECKING:  # these
    Redis = OGRedis[bytes]  # 4 lines
else:  # are
    Redis = OGRedis  # the only difference


async def func() -> None:
    connection_pool = ConnectionPool.from_url(settings.redis_url)
    async with Redis(connection_pool=connection_pool) as redis:
        await redis.set(
            name="test",
            value="Hello World",
        )
$ mypy project/
Success: no issues found in 3 source files

That's either a bug or an expected behavior that can be documented. I can imagine a programmer spending an hour debugging and searching why his/her code isn't validated properly.

Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
Ø Merge
1 T. 18 Std.
Gemergte PRs (30 T.)
54

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus python/mypy

Alle Issues in python/mypy

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.