Skip to content

[regression] Files with mixed strict-optional forget None'able argument (with ParamSpec decorator) #16246

Closed as not planned

Description

@intgr

Bug Report

I am in the progress of introducing strict_optional in my project. Some files have strict_optional disabled, others enabled.

Updating from mypy 1.5.1 to 1.6.0 caused some false positives when passing None to x | None arguments that are called across module boundaries.

To Reproduce

module_a.py:

# mypy: no-strict-optional

from typing import Callable, ParamSpec, TypeVar

P = ParamSpec("P")
T = TypeVar("T")


def paramspec_decorator(func: Callable[P, T]) -> Callable[P, T]:
    return func


@paramspec_decorator
def example_func(arg: str | None) -> None:
    print(arg)

module_b.py:

from module_a import example_func

example_func(None)

Expected Behavior

example_func should accept None argument.

Actual Behavior

% mypy --strict module_b.py
module_b.py:3: error: Argument 1 to "example_func" has incompatible type "None"; expected "str"  [arg-type]
Found 1 error in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.6.0
  • Mypy command-line flags: --strict
  • Python version used: 3.11.5

Activity

  1. changed the title [-][regression] Files with mixed `strict-optional` forget None'abe argument (with ParamSpec decorator)[/-] [+][regression] Files with mixed `strict-optional` forget None'able argument (with ParamSpec decorator)[/+] on Oct 11, 2023
  2. ilevkivskyi commented on Oct 11, 2023

    @ilevkivskyi
    Member

    I understand this behavior may be surprising, but this is not a bug actually. This behavior is consistent with how e.g. regular type variables (and other types) always behaved with no-strict-optional, see #15932 where this was originally reported. ParamSpec was accidentally special.

    Note this flag doesn't mean "do not report errors related to None in this file" (because it is actually not a well defined thing), but rather "in this file None is considered as subtype of all types".

  3. intgr commented on Oct 13, 2023

    @intgr
    ContributorAuthor

    Fair enough, this can be solved on my end by migrating more files to strict_optional=true.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions