Skip to content

Respect explicit return type of __new__()#21441

Merged
ilevkivskyi merged 18 commits into
python:masterfrom
ilevkivskyi:new-new
May 27, 2026
Merged

Respect explicit return type of __new__()#21441
ilevkivskyi merged 18 commits into
python:masterfrom
ilevkivskyi:new-new

Conversation

@ilevkivskyi
Copy link
Copy Markdown
Member

@ilevkivskyi ilevkivskyi commented May 8, 2026

Fixes #8330
Fixes #15182
Closes #16020
Closes #14471
Fixes #13824
Fixes #14502

With this PR will still give an error if the explicit return __new__() is not a subtype of current class, but now we will actually use it. There are two exceptions (to preserve backwards compatibility):

  • If the return type is Any with still use current class as the return type.
  • If the explicit return type comes from a superclass and is a supertype of implicit return type.
class A:
    def __new__(cls): ...
reveal_type(A())  # still __main__.A

class B:
    def __new__(cls) -> B:
        return cls()
class C(B): ...
reveal_type(C())  # still __main__.C

This uses a more principled implementation than some earlier attempts: adding a new dedicated attribute to CallableType for this purpose. Some comments:

  • This PR has a bit for boilerplate, but this is expected. When adding a new attribute to a type, one needs to update most visitors.
  • While doing the above I noticed that CallableType.type_guard and CallableType.type_is were not handled in dependency visitors (neither coarse-grained nor fine-grained). IMO they definitely should be handled there, so I now handle them.
  • I try to reduce the size of CallableType a bit to compensate for new attribute by removing (rarely used) min_args attribute. I also use compact flags serialization.
  • I skimmed the code base and updated all places where we "casually" use CallableType.ret_type for various type object edge cases.
  • Note that I don't assert that instance_type is set when is_type_obj() returns True. This is mostly to avoid breaking 3rd party plugins.
  • I didn't add a test case for each edge case, but I added (improved) test cases from Believe more __new__ return types #16020 plus some more. Suggestions for more test cases are welcome.
  • It looks like this exposes a pre-existing bug where we leaked type variables in type[T]. It is relatively niche edge case, but it looks important for NumPy stubs, so I am trying to fix it here.

@github-actions

This comment has been minimized.

@ilevkivskyi ilevkivskyi requested review from JukkaL and hauntsaninja May 8, 2026 14:44
@ilevkivskyi
Copy link
Copy Markdown
Member Author

mypy_primer looks sad, but I guess this is what people want. I spot-checked the new errors, and they all look correct. The only one suspicious thing in one new Any error in pandas-stubs.

cc @Dr-Irv for all the new errors in pandas. IIUC these are because of things like this https://github.com/pandas-dev/pandas/blob/47f6ccdbec98998bd675324fb6f049794ad03acf/pandas/_libs/tslibs/timestamps.pyi#L44-L60

class Timestamp(datetime):
    ...
    def __new__(  # type: ignore[misc]
        cls: type[Self],
        # ...
    ) -> Self | NaTType: ...

@Dr-Irv
Copy link
Copy Markdown

Dr-Irv commented May 8, 2026

mypy_primer looks sad, but I guess this is what people want. I spot-checked the new errors, and they all look correct. The only one suspicious thing in one new Any error in pandas-stubs.

Yes, I agree that is suspicious.

cc @Dr-Irv for all the new errors in pandas. IIUC these are because of things like this https://github.com/pandas-dev/pandas/blob/47f6ccdbec98998bd675324fb6f049794ad03acf/pandas/_libs/tslibs/timestamps.pyi#L44-L60

class Timestamp(datetime):
    ...
    def __new__(  # type: ignore[misc]
        cls: type[Self],
        # ...
    ) -> Self | NaTType: ...

We should probably copy the PYI for Timestamp and Timedelta and NAType from pandas-stubs into the pandas source at some point to address this.

I have on my TODO list to first make the pandas source compatible with the latest release of mypy. So when these changes in this PR get released, I'll do a similar task then.

@bzoracler
Copy link
Copy Markdown
Contributor

bzoracler commented May 8, 2026

  • If the return type is Any with still use current class as the return type.
  • If the explicit return type comes from a superclass and is a supertype of implicit return type.

Would the following alternatives also preserve backwards compatibility just as well, but reflect explicit intention better?

  • If the return type is unannotated (i.e. an explicit Any is not used):

    class A:
        def __new__(cls, arg: object): ...
    
    class B:
        def __new__(cls, arg: object) -> Any: ...
    
    class C:
        def __new__(cls, arg: object) -> "bad + annotation": ...
    
    reveal_type(A())  # `__main__.A`
    reveal_type(B())  # `Any`
    reveal_type(C())  # `Any`
  • If the explicit return type comes from a superclass and the superclass's __new__'s return type is the same as the class:

    class A:
        def __new__(cls) -> A: ...
    class B(A):
        def __new__(cls) -> A: ...
    
    class C(B): ...
    class D(A): ...
    
    reveal_type(C())  # Would it be possible for this to be `__main__.A`?
    reveal_type(D())  # `__main__.D`

    This pattern came up when I was trying to write stubs for symengine.py a while back (maybe it affects SymPy too), where they have a root Expr class, and most of Expr's subclasses have a __new__ that frequently returns something that is not an instance of the subclass.

    I'm hoping that "__new__'s return type being the same as a class" would handle the vast majority of backwards compatibility cases because it was common before typing.Self was introduced.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

@bzoracler Yeah, I actually was thinking about both these options myself. Reasons why I didn't do this:

  • We have a specific test checking that explicit def __new__() -> Any is ignored, see testNewReturnType2. I don't know the motivation, so decided to simply not touch that.
  • The definition of "the same as the class" gets a little blurry in case of generic classes. For example, is plain -> C (and not say -> C[T]) considered the same, etc.

However, I don't have strong feelings on either, so if others will chime in, I am happy reconsider.

@github-actions

This comment has been minimized.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

It looks like this exposes a pre-existing bug where we leaked type variables in type[T]. It is relatively niche edge case, but it looks important for NumPy stubs, so I am trying to fix it here.

@github-actions

This comment has been minimized.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

OK, mypy_primer looks good now. @hauntsaninja @JukkaL this is ready for review now. You may also want to say what do you think about this comment #21441 (comment)

@hauntsaninja
Copy link
Copy Markdown
Collaborator

I mostly agree with bzoracler:

  • if there is an explicit return Any, ideally we should reveal Any
  • the biggest reason for back compat is code that predates Self, so the heuristic for return typing matching current class makes sense to me

Will look at the diff in a little bit!

@github-actions

This comment has been minimized.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

OMG! We are actually handling arbitrary class object with return type Any as builtins.type, see

and is_equivalent(callee.ret_type, self.named_type("builtins.type"))
I am surprised this didn't cause a ton of issues.

@github-actions

This comment has been minimized.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

@hauntsaninja I tried your (or really @bzoracler's) suggestions. Looking at the primer I am slightly worried this may cause false negatives. It looks like there is still some code doing this:

class C:
    def __new__(cls) -> Any:  # to silence a mypy error from some old version
        return super().__new__(cls)

Otherwise however the primer looks as expected.

@bzoracler
Copy link
Copy Markdown
Contributor

class C:
    def __new__(cls) -> Any:  # to silence a mypy error from some old version
        return super().__new__(cls)

In this example, are we saying that return super().__new__(cls) returns something that an old version of mypy rejected, so the user put Any as the return type (instead of, say, C)?

Hmm, I can only think of this being an issue if C was a generic type and the user (or the old mypy) could not properly get the generic parameterisation of -> C[...] to match return super().__new__(...). In this case, I can see why keeping the current behaviour, where the return type is C[...] even if the user wrote -> Any, would work. I don't recall coming across this situation (to be fair it sounds quite easily missable if there's no inline comment/docstring to explain -> Any), so I don't have strong opinions on this.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

@bzoracler OK, I did some digging and it looks like mypy (until v0.920) used to infer super().__new__(cls) as Any which resulted in Returning Any from function declared to return "C" (e.g. for people with --strict or --warn-return-any). This is why some repos still have this.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

@hauntsaninja

Will look at the diff in a little bit!

Ping on this one.

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Collaborator

@JukkaL JukkaL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did a quick pass, not a full review.

# determining the return type
class A:
def __new__(cls):
pass

class B:
def __new__(cls) -> Any:
def __new__(cls, x: int = 0) -> Any:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about partial signature, but implicit Any return type? For example, def __new__(self, x: int = 0): ...

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a test (works as expected, we infer C as constructor return type).

def foo(self) -> str: ...

class A:
def __new__(cls) -> Foo: ... # E: Incompatible return type for "__new__" (returns "Foo", but must return a subtype of "A")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test if A is compatible with Callable[[], Foo] or Callable[[], A]? Also similarly against callback protocol.

Is it worth testing type joins involving __new__ return type overrides?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a bunch of tests for subtyping (btw this uncovered one type combination I missed). Also added few basic things for joins. All works as expected.


class C(B): ...

# Always respect explicit return type after giving an error.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This feels a bit inconsistent and causes false negatives. Would changing cause many issues in existing code?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you mean by inconsistent? How is this different from say:

class B:
    x: str
class C(B):
    x: int  # Error
class D(C): ...

reveal_type(C().x)  # int
reveal_type(D().x)  # int

Also this is kind of the whole point of what people want: respect the explicit return type.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'm convinced that the new behavior is good.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

Copy link
Copy Markdown
Collaborator

@JukkaL JukkaL left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good -- nice to have this working finally. Left some minor comments, feel free to merge once you've addressed those that make sense.


class C(B): ...

# Always respect explicit return type after giving an error.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'm convinced that the new behavior is good.

def __call__(self) -> Foo: ...

def f(x: Callable[[], A]) -> None: ...
def g(x: Callable[[], Foo]) -> None: ...
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Callable[[], T] -- T should be inferred from the __new__ return type when relevant.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, there was the same issue in constraints.py as in subtypes.py.


# This tests the type repr in error messages.
j = join(A, B)
x: int = j # E: Incompatible types in assignment (expression has type "type[Base2]", variable has type "int")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about testing isinstance narrowing with a type that has an explicit __new__ return type?

Comment thread mypy/types.py
"from_concatenate": self.from_concatenate,
"imprecise_arg_kinds": self.imprecise_arg_kinds,
"unpack_kwargs": self.unpack_kwargs,
"instance_type": (
self.instance_type.serialize() if self.instance_type is not None else None
),
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add an incremental test case?

@github-actions

This comment has been minimized.

@ilevkivskyi
Copy link
Copy Markdown
Member Author

I briefly searched the tracker for issues with __new__ and found some more that this will fix. I didn't look too deep however. I am going to add a regression test that seems important.

@github-actions
Copy link
Copy Markdown
Contributor

Diff from mypy_primer, showing the effect of this PR on open source code:

zope.interface (https://github.com/zopefoundation/zope.interface)
- src/zope/interface/common/tests/test_collections.py:88: error: Incompatible types in assignment (expression has type "set[type[array[int]]]", base class "VerifyClassMixin" defined the type as "tuple[()]")  [assignment]
+ src/zope/interface/common/tests/test_collections.py:88: error: Incompatible types in assignment (expression has type "set[type[array[_T]]]", base class "VerifyClassMixin" defined the type as "tuple[()]")  [assignment]

comtypes (https://github.com/enthought/comtypes)
- comtypes/server/register.py:226: error: Incompatible types in assignment (expression has type "reversed[tuple[int, str]]", variable has type "list[tuple[int, str]]")  [assignment]
+ comtypes/server/register.py:226: error: Incompatible types in assignment (expression has type "Iterator[tuple[int, str]]", variable has type "list[tuple[int, str]]")  [assignment]

antidote (https://github.com/Finistere/antidote)
+ src/antidote/lib/interface_ext/predicate.py:118: error: Returning Any from function declared to return "NeutralWeight"  [no-any-return]
+ src/antidote/lib/interface_ext/qualifier.py:134: error: Returning Any from function declared to return "NeutralWeight"  [no-any-return]
+ tests/lib/interface/test_custom.py:205: error: Returning Any from function declared to return "NeutralWeight"  [no-any-return]

discord.py (https://github.com/Rapptz/discord.py)
- discord/abc.py:1815: error: Incompatible types in assignment (expression has type "reversed[MessagePin]", variable has type "list[MessagePin]")  [assignment]
+ discord/abc.py:1815: error: Incompatible types in assignment (expression has type "Iterator[MessagePin]", variable has type "list[MessagePin]")  [assignment]

sympy (https://github.com/sympy/sympy)
+ sympy/core/evalf.py:997: error: Argument 1 to "evalf_add" has incompatible type "Expr"; expected "Add"  [arg-type]
+ sympy/core/function.py:449: error: Unused "type: ignore" comment  [unused-ignore]
+ sympy/printing/smtlib.py:188: error: Argument 1 to "_print_Unequality" of "SMTLibPrinter" has incompatible type "Unequality | BooleanFalse | BooleanTrue"; expected "Unequality"  [arg-type]

tornado (https://github.com/tornadoweb/tornado)
+ tornado/test/ioloop_test.py:433: error: Unused "type: ignore" comment  [unused-ignore]

pandas (https://github.com/pandas-dev/pandas)
+ pandas/tseries/frequencies.py:336: error: Incompatible return value type (got "Timestamp | NaTType", expected "Timestamp")  [return-value]
- pandas/core/dtypes/cast.py:698: error: Non-overlapping identity check (left operand type: "Timestamp", right operand type: "NaTType")  [comparison-overlap]
- pandas/core/dtypes/cast.py:711: error: Non-overlapping identity check (left operand type: "Timedelta", right operand type: "NaTType")  [comparison-overlap]
+ pandas/core/dtypes/cast.py:159: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "str | bytes | date | datetime | timedelta | <7 more items> | Interval[Any] | complex | integer[Any] | floating[Any] | complexfloating[Any, Any]")  [assignment]
+ pandas/core/dtypes/cast.py:161: error: Incompatible types in assignment (expression has type "Timedelta | NaTType", variable has type "str | bytes | date | datetime | timedelta | <7 more items> | Interval[Any] | complex | integer[Any] | floating[Any] | complexfloating[Any, Any]")  [assignment]
+ pandas/core/arrays/_ranges.py:147: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp | None")  [assignment]
+ pandas/core/arrays/datetimes.py:832: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "unit"  [union-attr]
+ pandas/core/arrays/datetimes.py:3177: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp | None")  [assignment]
+ pandas/core/arrays/datetimes.py:3177: note: Error code "assignment" not covered by "type: ignore[arg-type]" comment
- pandas/core/arrays/datetimes.py:3178: error: Non-overlapping identity check (left operand type: "Timestamp", right operand type: "NaTType")  [comparison-overlap]
+ pandas/core/arrays/datetimes.py:3178: error: Non-overlapping identity check (left operand type: "Timestamp | None", right operand type: "NaTType")  [comparison-overlap]
+ pandas/core/arrays/datetimes.py:3179: error: Item "None" of "Timestamp | None" has no attribute "as_unit"  [union-attr]
+ pandas/core/arrays/datetimes.py:3185: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp | None")  [assignment]
+ pandas/core/arrays/datetimes.py:3185: note: Error code "assignment" not covered by "type: ignore[arg-type]" comment
- pandas/core/arrays/datetimes.py:3186: error: Non-overlapping identity check (left operand type: "Timestamp", right operand type: "NaTType")  [comparison-overlap]
+ pandas/core/arrays/datetimes.py:3186: error: Non-overlapping identity check (left operand type: "Timestamp | None", right operand type: "NaTType")  [comparison-overlap]
+ pandas/core/arrays/datetimes.py:3187: error: Item "None" of "Timestamp | None" has no attribute "as_unit"  [union-attr]
+ pandas/core/arrays/period.py:385: error: Incompatible return value type (got "Period | NaTType", expected "Period")  [return-value]
+ pandas/core/arrays/period.py:1228: error: Argument 1 to "_add_timedelta_arraylike" of "PeriodArray" has incompatible type "ndarray[tuple[Any, ...], dtype[generic[date | int | timedelta | None]]]"; expected "TimedeltaArray | ndarray[tuple[Any, ...], dtype[timedelta64[timedelta | int | None]]]"  [arg-type]
+ pandas/core/arrays/period.py:1343: error: Argument 1 to "delta_to_tick" has incompatible type "Timedelta | NaTType"; expected "timedelta"  [arg-type]
+ pandas/core/window/rolling.py:2023: error: Incompatible types in assignment (expression has type "int | signedinteger[_64Bit]", variable has type "int | None")  [assignment]
+ pandas/core/tools/datetimes.py:633: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_julian_date"  [union-attr]
+ pandas/core/indexes/timedeltas.py:324: error: Argument 1 to "to_offset" has incompatible type "Timedelta | NaTType"; expected "timedelta | str | PeriodDtypeBase"  [arg-type]
+ pandas/core/indexes/timedeltas.py:324: note: Error code "arg-type" not covered by "type: ignore[operator]" comment
+ pandas/core/indexes/period.py:673: error: Incompatible return value type (got "Period | NaTType", expected "Period")  [return-value]
+ pandas/core/indexes/period.py:700: error: Item "NaTType" of "Period | NaTType" has no attribute "asfreq"  [union-attr]
+ pandas/core/indexes/datetimes.py:943: error: Unsupported left operand type for % ("NaTType")  [operator]
+ pandas/core/indexes/datetimes.py:943: note: Left operand is of type "Timedelta | NaTType"
+ pandas/core/indexes/datetimes.py:1120: error: Item "NaTType" of "Period | NaTType" has no attribute "start_time"  [union-attr]
+ pandas/core/indexes/datetimes.py:1123: error: Unsupported operand types for + ("NaTType" and "int")  [operator]
+ pandas/core/indexes/datetimes.py:1123: note: Left operand is of type "Period | NaTType"
+ pandas/core/indexes/datetimes.py:1148: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "datetime")  [assignment]
+ pandas/core/indexes/datetimes.py:1154: error: "datetime" has no attribute "tz_localize"  [attr-defined]
+ pandas/core/indexes/datetimes.py:1156: error: Incompatible return value type (got "tuple[datetime, Resolution]", expected "tuple[Timestamp, Resolution]")  [return-value]
+ pandas/core/indexes/datetimes.py:1735: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "unit"  [union-attr]
+ pandas/core/indexes/datetimes.py:1736: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "unit"  [union-attr]
+ pandas/core/indexes/datetimelike.py:1139: error: Argument 1 to "to_offset" has incompatible type "Timedelta | NaTType"; expected "timedelta | str | PeriodDtypeBase"  [arg-type]
+ pandas/core/resample.py:2524: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Literal['epoch', 'start', 'start_day', 'end', 'end_day'] | Timestamp")  [assignment]
+ pandas/core/resample.py:2648: error: Argument "offset" to "_get_timestamp_range_edges" has incompatible type "Timedelta | NaTType | None"; expected "Timedelta | None"  [arg-type]
+ pandas/core/resample.py:2840: error: Argument "offset" to "_get_period_range_edges" has incompatible type "Timedelta | NaTType | None"; expected "Timedelta | None"  [arg-type]
+ pandas/core/resample.py:2959: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Literal['epoch', 'start', 'start_day', 'end', 'end_day'] | Timestamp")  [assignment]
+ pandas/core/resample.py:2975: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp")  [assignment]
+ pandas/core/resample.py:2977: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp")  [assignment]
+ pandas/core/resample.py:2979: error: Incompatible types in assignment (expression has type "Timestamp | NaTType", variable has type "Timestamp")  [assignment]
+ pandas/core/resample.py:3091: error: No overload variant of "__mul__" of "signedinteger" matches argument type "Tick"  [operator]
+ pandas/core/resample.py:3091: note: Possible overload variants:
+ pandas/core/resample.py:3091: note:     def __mul__(self, int | signedinteger[_8Bit] | numpy.bool[builtins.bool] | signedinteger[_64Bit], /) -> signedinteger[_64Bit]
+ pandas/core/resample.py:3091: note:     def __mul__(self, float, /) -> float64
+ pandas/core/resample.py:3091: note:     def __mul__(self, complex, /) -> complex128
+ pandas/core/resample.py:3091: note:     def __mul__(self, signedinteger[Any], /) -> signedinteger[Any]
+ pandas/core/resample.py:3091: note:     def __mul__(self, integer[Any], /) -> Any
+ pandas/core/resample.py:3091: note: Left operand is of type "int | signedinteger[_64Bit]"
+ pandas/core/resample.py:3139: error: Incompatible return value type (got "tuple[Timestamp | NaTType, Timestamp | NaTType]", expected "tuple[Timestamp, Timestamp]")  [return-value]
+ pandas/io/excel/_odfreader.py:220: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "time"  [union-attr]
+ pandas/tseries/holiday.py:262: error: Incompatible types in assignment (expression has type "Timestamp | NaTType | None", variable has type "Timestamp | None")  [assignment]
+ pandas/tseries/holiday.py:264: error: Incompatible types in assignment (expression has type "Timestamp | NaTType | None", variable has type "Timestamp | None")  [assignment]
+ pandas/tests/tslibs/test_timedeltas.py:24: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:277: error: Unsupported operand types for - ("NaTType" and "Nano")  [operator]
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:277: note: Left operand is of type "Timestamp | NaTType"
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:278: error: Unsupported operand types for - ("NaTType" and "Nano")  [operator]
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:278: note: Left operand is of type "Timestamp | NaTType"
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:288: error: Unsupported operand types for - ("NaTType" and "Nano")  [operator]
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:288: note: Left operand is of type "Timestamp | NaTType"
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:289: error: Unsupported operand types for - ("NaTType" and "Nano")  [operator]
+ pandas/tests/tseries/offsets/test_custom_business_hour.py:289: note: Left operand is of type "Timestamp | NaTType"
+ pandas/tests/tseries/offsets/test_business_day.py:78: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/tseries/offsets/test_business_day.py:79: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/series/indexing/test_setitem.py:512: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/series/indexing/test_setitem.py:513: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/scalar/test_nat.py:557: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/scalar/test_nat.py:558: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/scalar/timedelta/test_timedelta.py:266: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "max"  [union-attr]
+ pandas/tests/scalar/interval/test_arithmetic.py:116: error: Value of type variable "_OrderableT" of "Interval" cannot be "Timestamp | NaTType"  [type-var]
+ pandas/tests/scalar/interval/test_arithmetic.py:119: error: Value of type variable "_OrderableT" of "Interval" cannot be "Timedelta | NaTType"  [type-var]
+ pandas/tests/indexes/test_engines.py:62: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/indexes/test_engines.py:63: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:72: error: List item 0 has incompatible type "list[Timestamp | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:79: error: List item 1 has incompatible type "list[Timestamp | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:86: error: List item 2 has incompatible type "list[Timedelta | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:93: error: List item 3 has incompatible type "list[Period | Any]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:94: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:95: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:96: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:97: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:98: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:202: error: List item 0 has incompatible type "list[float | Timestamp | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:212: error: List item 1 has incompatible type "list[float | Timestamp | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:222: error: List item 2 has incompatible type "list[float | Timedelta | NaTType]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:232: error: List item 3 has incompatible type "list[float | Period | Any]"; expected "ndarray[tuple[Any, ...], dtype[Any]]"  [list-item]
+ pandas/tests/groupby/methods/test_rank.py:233: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:234: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:236: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:237: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/groupby/methods/test_rank.py:238: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/arrays/test_timedeltas.py:215: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/arrays/test_timedeltas.py:216: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arrays/test_timedeltas.py:238: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/arrays/test_datetimes.py:669: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "to_period"  [union-attr]
+ pandas/tests/arrays/test_datetimelike.py:187: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "time"  [union-attr]
+ pandas/tests/arithmetic/conftest.py:70: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arithmetic/conftest.py:72: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/arithmetic/conftest.py:87: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arithmetic/conftest.py:106: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arithmetic/conftest.py:131: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/plotting/_matplotlib/converter.py:153: error: Item "NaTType" of "Timestamp | NaTType" has no attribute "time"  [union-attr]
+ pandas/plotting/_matplotlib/converter.py:309: error: Item "NaTType" of "Period | NaTType" has no attribute "ordinal"  [union-attr]
+ pandas/conftest.py:1575: error: Incompatible return value type (got "Timestamp | NaTType", expected "Timestamp")  [return-value]
+ pandas/tests/arithmetic/test_timedelta64.py:87: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/arithmetic/test_period.py:42: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arithmetic/test_period.py:59: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]
+ pandas/tests/arithmetic/test_numeric.py:227: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_timedelta64"  [union-attr]
+ pandas/tests/arithmetic/test_numeric.py:228: error: Item "NaTType" of "Timedelta | NaTType" has no attribute "to_pytimedelta"  [union-attr]

... (truncated 8 lines) ...

jax (https://github.com/google/jax)
- jax/experimental/pallas/ops/tpu/splash_attention/splash_attention_mask_info.py:729: error: Incompatible types in assignment (expression has type "ndarray[tuple[Any, ...], dtype[numpy.bool[builtins.bool]]]", variable has type "list[ndarray[tuple[Any, ...], dtype[Any]]] | None")  [assignment]
+ jax/experimental/pallas/ops/tpu/splash_attention/splash_attention_mask_info.py:729: error: Incompatible types in assignment (expression has type "ndarray[tuple[Any, ...], dtype[bool[Any]]]", variable has type "list[ndarray[tuple[Any, ...], dtype[Any]]] | None")  [assignment]

starlette (https://github.com/encode/starlette)
+ starlette/testclient.py:143: error: Incompatible types in assignment (expression has type "tuple[MemoryObjectSendStream[MutableMapping[str, Any]], MemoryObjectReceiveStream[MutableMapping[str, Any]]]", variable has type "create_memory_object_stream[MutableMapping[str, Any]]")  [assignment]
+ starlette/testclient.py:145: error: Incompatible types in assignment (expression has type "tuple[MemoryObjectSendStream[MutableMapping[str, Any]], MemoryObjectReceiveStream[MutableMapping[str, Any]]]", variable has type "create_memory_object_stream[MutableMapping[str, Any]]")  [assignment]
+ starlette/testclient.py:692: error: Incompatible types in assignment (expression has type "tuple[MemoryObjectSendStream[MutableMapping[str, Any] | None], MemoryObjectReceiveStream[MutableMapping[str, Any] | None]]", variable has type "create_memory_object_stream[MutableMapping[str, Any] | None]")  [assignment]
+ starlette/testclient.py:694: error: Incompatible types in assignment (expression has type "tuple[MemoryObjectSendStream[MutableMapping[str, Any]], MemoryObjectReceiveStream[MutableMapping[str, Any]]]", variable has type "create_memory_object_stream[MutableMapping[str, Any]]")  [assignment]
+ starlette/middleware/base.py:189: error: Incompatible types in assignment (expression has type "tuple[MemoryObjectSendStream[MutableMapping[str, Any]], MemoryObjectReceiveStream[MutableMapping[str, Any]]]", variable has type "create_memory_object_stream[MutableMapping[str, Any]]")  [assignment]

@ilevkivskyi ilevkivskyi merged commit 938dbe2 into python:master May 27, 2026
25 checks passed
@ilevkivskyi ilevkivskyi deleted the new-new branch May 27, 2026 01:13
@jorenham
Copy link
Copy Markdown
Contributor

This is awesome; thanks!

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

Labels

None yet

Projects

None yet

6 participants