Calling int() and str() with no arguments returns 0 and "" respectively, likewise for bool() == False and bytes() == b"". But to actually call these constructors without arguments is very unusual and is likely a mistake on part of the user.
# a and b are two strings
x = int(a)
y = int() # typo, should be int(b)
x / y # ZeroDivisionError
It will be helpful for type stubs to denote that such no-argument calls return a constant value, and for IDEs to possibly notify of such use.
Currently the stub for int.__new__ looks like this:
|
def __new__(cls, x: ConvertibleToInt = 0, /) -> Self: ... |
class int:
@overload
def __new__(cls, x: ConvertibleToInt = 0, /) -> Self: ...
and str.__new__:
class str(Sequence[str]):
@overload
def __new__(cls, object: object = "") -> Self: ...
I suggest adding an overload with no argument and removing the default parameter value from the one-arg __new__, though I'm not sure if there are existing special behaviors of type checkers regarding builtins that I'm unaware of.
Calling
int()andstr()with no arguments returns0and""respectively, likewise forbool() == Falseandbytes() == b"". But to actually call these constructors without arguments is very unusual and is likely a mistake on part of the user.It will be helpful for type stubs to denote that such no-argument calls return a constant value, and for IDEs to possibly notify of such use.
Currently the stub for
int.__new__looks like this:typeshed/stdlib/builtins.pyi
Line 257 in 904ea9e
and
str.__new__:I suggest adding an overload with no argument and removing the default parameter value from the one-arg
__new__, though I'm not sure if there are existing special behaviors of type checkers regarding builtins that I'm unaware of.