Skip to content

yt-dlp: impossible to narrow types #16332

Description

@mahyarmirrashed

I have this piece of code:

def fetch_channel_info(channel: str) -> tuple[str, str, list[str]]:
    ...

    with yt_dlp.YoutubeDL(opts) as ydl:
        videos_info = ydl.extract_info(videos_url, download=False)

    entries = videos_info.get("entries") or []

    video_ids: list[str] = []
    for entry in entries:
        if isinstance(entry, dict):
            video_id = entry.get("id")
            if video_id and isinstance(video_id, str):
                video_ids.append(video_id)

The type-checker cannot narrow the entry variable enough for this to work.

     ├╴W Type of "video_id" is partially unknown
     │     Type of "video_id" is "str | Unknown | None" basedpyright (reportUnknownVariableType) [63, 13]
     └╴W Type of "get" is partially unknown
           Type of "get" is "Overload[(k: Literal['id']) -> str, (k: Literal['id'], default: Any) -> str, (k: Literal['title']) -> (str | None), (k: Literal['title'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['formats']) -> (list[dict[str, Any]] | None), (k: Literal['formats'], default: list[dict[str, Any]] | __TDefault@_InfoDict | None) -> (list[dict[str, Any]] | __TDefault@_InfoDict | None), (k: Literal['available_at']) -> (int | None), (k: Literal['available_at'], default: int | __TDefault@_InfoDict) -> (int | __TDefault@_InfoDict), (k: Literal['url']) -> (str | None), (k: Literal['url'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['ext']) -> (str | None), (k: Literal['ext'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['format']) -> (str | None), (k: Literal['format'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['player_url']) -> (str | None), (k: Literal['player_url'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['direct']) -> (bool | None), (k: Literal['direct'], default: bool | __TDefault@_InfoDict | None) -> (bool | __TDefault@_InfoDict | None), (k: Literal['alt_title']) -> (str | None), (k: Literal['alt_title'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['display_id']) -> (Any | None), (k: Literal['display_id'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['thumbnails']) -> (list[dict[str, Any]] | None), (k: Literal['thumbnails'], default: list[dict[str, Any]] | __TDefault@_InfoDict | None) -> (list[dict[str, Any]] | __TDefault@_InfoDict | None), (k: Literal['thumbnail']) -> (str | None), (k: Literal['thumbnail'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['description']) -> (str | None), (k: Literal['description'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['uploader']) -> (str | None), (k: Literal['uploader'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['license']) -> (str | None), (k: Literal['license'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['creators']) -> (list[str] | None), (k: Literal['creators'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['timestamp']) -> (int | float | None), (k: Literal['timestamp'], default: int | float | __TDefault@_InfoDict | None) -> (int | float | __TDefault@_InfoDict | None), (k: Literal['upload_date']) -> (Any | None), (k: Literal['upload_date'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['release_timestamp']) -> (Any | None), (k: Literal['release_timestamp'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['release_date']) -> (Any | None), (k: Literal['release_date'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['release_year']) -> (Any | None), (k: Literal['release_year'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['modified_timestamp']) -> (Any | None), (k: Literal['modified_timestamp'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['modified_date']) -> (Any | None), (k: Literal['modified_date'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['uploader_id']) -> (Any | None), (k: Literal['uploader_id'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['uploader_url']) -> (str | None), (k: Literal['uploader_url'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['channel']) -> (str | None), (k: Literal['channel'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['channel_id']) -> (Any | None), (k: Literal['channel_id'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['channel_url']) -> (str | None), (k: Literal['channel_url'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['channel_follower_count']) -> (int | None), (k: Literal['channel_follower_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['channel_is_verified']) -> (Any | None), (k: Literal['channel_is_verified'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['location']) -> (Any | None), (k: Literal['location'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['subtitles']) -> (Any | None), (k: Literal['subtitles'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['automatic_captions']) -> (Any | None), (k: Literal['automatic_captions'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['duration']) -> (int | None), (k: Literal['duration'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['view_count']) -> (int | None), (k: Literal['view_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['concurrent_view_count']) -> (int | None), (k: Literal['concurrent_view_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['save_count']) -> (int | None), (k: Literal['save_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['like_count']) -> (int | None), (k: Literal['like_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['dislike_count']) -> (int | None), (k: Literal['dislike_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['repost_count']) -> (int | None), (k: Literal['repost_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['average_rating']) -> (Any | None), (k: Literal['average_rating'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['comment_count']) -> (int | None), (k: Literal['comment_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['comments']) -> (Any | None), (k: Literal['comments'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['age_limit']) -> (int | None), (k: Literal['age_limit'], default: int | __TDefault@_InfoDict) -> (int | __TDefault@_InfoDict), (k: Literal['webpage_url']) -> (str | None), (k: Literal['webpage_url'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['categories']) -> (list[str] | None), (k: Literal['categories'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['tags']) -> (list[str] | None), (k: Literal['tags'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['cast']) -> (list[Any] | None), (k: Literal['cast'], default: list[Any] | __TDefault@_InfoDict | None) -> (list[Any] | __TDefault@_InfoDict | None), (k: Literal['is_live']) -> (bool | None), (k: Literal['is_live'], default: bool | __TDefault@_InfoDict | None) -> (bool | __TDefault@_InfoDict | None), (k: Literal['was_live']) -> (bool | None), (k: Literal['was_live'], default: bool | __TDefault@_InfoDict | None) -> (bool | __TDefault@_InfoDict | None), (k: Literal['live_status']) -> (Literal['is_live', 'is_upcoming', 'was_live', 'not_live', 'post_live'] | None), (k: Literal['live_status'], default: __TDefault@_InfoDict | Literal['is_live', 'is_upcoming', 'was_live', 'not_live', 'post_live'] | None) -> (__TDefault@_InfoDict | Literal['is_live', 'is_upcoming', 'was_live', 'not_live', 'post_live'] | None), (k: Literal['start_time']) -> (Any | None), (k: Literal['start_time'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['end_time']) -> (Any | None), (k: Literal['end_time'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['chapters']) -> (Any | None), (k: Literal['chapters'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['heatmap']) -> (Any | None), (k: Literal['heatmap'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['playable_in_embed']) -> (bool | str | None), (k: Literal['playable_in_embed'], default: bool | str | __TDefault@_InfoDict | None) -> (bool | str | __TDefault@_InfoDict | None), (k: Literal['availability']) -> (Literal['private', 'premium_only', 'subscriber_only', 'needs_auth', 'unlisted', 'public'] | None), (k: Literal['availability'], default: __TDefault@_InfoDict | Literal['private', 'premium_only', 'subscriber_only', 'needs_auth', 'unlisted', 'public'] | None) -> (__TDefault@_InfoDict | Literal['private', 'premium_only', 'subscriber_only', 'needs_auth', 'unlisted', 'public'] | None), (k: Literal['media_type']) -> (str | None), (k: Literal['media_type'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['_old_archive_ids']) -> (Any | None), (k: Literal['_old_archive_ids'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['_format_sort_fields']) -> (Any | None), (k: Literal['_format_sort_fields'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['chapter']) -> (str | None), (k: Literal['chapter'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['chapter_number']) -> (int | None), (k: Literal['chapter_number'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['chapter_id']) -> (str | None), (k: Literal['chapter_id'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['series']) -> (str | None), (k: Literal['series'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['series_id']) -> (str | None), (k: Literal['series_id'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['season']) -> (str | None), (k: Literal['season'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['season_number']) -> (int | None), (k: Literal['season_number'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['season_id']) -> (str | None), (k: Literal['season_id'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['episode']) -> (Any | None), (k: Literal['episode'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['episode_number']) -> (int | None), (k: Literal['episode_number'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['episode_id']) -> (str | None), (k: Literal['episode_id'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['track']) -> (str | None), (k: Literal['track'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['track_number']) -> (int | None), (k: Literal['track_number'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['track_id']) -> (str | None), (k: Literal['track_id'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['artists']) -> (list[str] | None), (k: Literal['artists'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['composers']) -> (list[str] | None), (k: Literal['composers'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['genres']) -> (list[str] | None), (k: Literal['genres'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['album']) -> (str | None), (k: Literal['album'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['album_type']) -> (str | None), (k: Literal['album_type'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: Literal['album_artists']) -> (list[str] | None), (k: Literal['album_artists'], default: list[str] | __TDefault@_InfoDict | None) -> (list[str] | __TDefault@_InfoDict | None), (k: Literal['disc_number']) -> (int | None), (k: Literal['disc_number'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['section_start']) -> (Any | None), (k: Literal['section_start'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['section_end']) -> (Any | None), (k: Literal['section_end'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['rows']) -> (int | None), (k: Literal['rows'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['columns']) -> (int | None), (k: Literal['columns'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['playlist_count']) -> (int | None), (k: Literal['playlist_count'], default: int | __TDefault@_InfoDict | None) -> (int | __TDefault@_InfoDict | None), (k: Literal['entries']) -> (Iterable[_InfoDict] | PagedList | None), (k: Literal['entries'], default: Iterable[_InfoDict] | PagedList | __TDefault@_InfoDict) -> (Iterable[_InfoDict] | PagedList | __TDefault@_InfoDict), (k: Literal['requested_formats']) -> (Iterable[_InfoDict] | None), (k: Literal['requested_formats'], default: Iterable[_InfoDict] | __TDefault@_InfoDict) -> (Iterable[_InfoDict] | __TDefault@_InfoDict), (k: Literal['composer']) -> (Any | None), (k: Literal['composer'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['artist']) -> (Any | None), (k: Literal['artist'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['genre']) -> (Any | None), (k: Literal['genre'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['album_artist']) -> (Any | None), (k: Literal['album_artist'], default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict), (k: Literal['creator']) -> (str | None), (k: Literal['creator'], default: str | __TDefault@_InfoDict | None) -> (str | __TDefault@_InfoDict | None), (k: str) -> (Any | None), (k: str, default: Any | __TDefault@_InfoDict) -> (Any | __TDefault@_InfoDict)] | Overload[(key: Unknown, default: None = None, /) -> (Unknown | None), (key: Unknown, default: Unknown, /) -> Unknown, (key: Unknown, default: _T@get, /) -> (Unknown | _T@get)]" basedpyright (reportUnknownMemberType) [63, 24]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions