Files
ruff/crates/red_knot_python_semantic/resources/mdtest/expression/boolean.md
Alex d77480768d [red-knot] Port type inference tests to new test framework (#13719)
## Summary

Porting infer tests to new markdown tests framework.

Link to the corresponding issue: #13696

---------

Co-authored-by: Carl Meyer <carl@astral.sh>
2024-10-15 11:23:46 -07:00

2.8 KiB

Expressions

OR

def foo() -> str:
    pass

a = True or False
b = 'x' or 'y' or 'z'
c = '' or 'y' or 'z'
d = False or 'z'
e = False or True
f = False or False
g = foo() or False
h = foo() or True

reveal_type(a)  # revealed: Literal[True]
reveal_type(b)  # revealed: Literal["x"]
reveal_type(c)  # revealed: Literal["y"]
reveal_type(d)  # revealed: Literal["z"]
reveal_type(e)  # revealed: Literal[True]
reveal_type(f)  # revealed: Literal[False]
reveal_type(g)  # revealed: str | Literal[False]
reveal_type(h)  # revealed: str | Literal[True]

AND

def foo() -> str:
    pass

a = True and False
b = False and True
c = foo() and False
d = foo() and True
e = 'x' and 'y' and 'z'
f = 'x' and 'y' and ''
g = '' and 'y'

reveal_type(a)  # revealed: Literal[False]
reveal_type(b)  # revealed: Literal[False]
reveal_type(c)  # revealed: str | Literal[False]
reveal_type(d)  # revealed: str | Literal[True]
reveal_type(e)  # revealed: Literal["z"]
reveal_type(f)  # revealed: Literal[""]
reveal_type(g)  # revealed: Literal[""]

Simple function calls to bool

def returns_bool() -> bool:
    return True

if returns_bool():
    x = True
else:
    x = False

reveal_type(x)  # revealed: bool

Complex

def foo() -> str:
    pass

a = "x" and "y" or "z"
b = "x" or "y" and "z"
c = "" and "y" or "z"
d = "" or "y" and "z"
e = "x" and "y" or ""
f = "x" or "y" and ""

reveal_type(a)  # revealed: Literal["y"]
reveal_type(b)  # revealed: Literal["x"]
reveal_type(c)  # revealed: Literal["z"]
reveal_type(d)  # revealed: Literal["z"]
reveal_type(e)  # revealed: Literal["y"]
reveal_type(f)  # revealed: Literal["x"]

bool() function

Evaluates to builtin

redefined_builtin_bool = bool

def my_bool(x)-> bool: pass
from a import redefined_builtin_bool, my_bool
a = redefined_builtin_bool(0)
b = my_bool(0)

reveal_type(a)  # revealed: Literal[False]
reveal_type(b)  # revealed: bool

Truthy values

a = bool(1)
b = bool((0,))
c = bool("NON EMPTY")
d = bool(True)

def foo(): pass
e = bool(foo)

reveal_type(a)  # revealed: Literal[True]
reveal_type(b)  # revealed: Literal[True]
reveal_type(c)  # revealed: Literal[True]
reveal_type(d)  # revealed: Literal[True]
reveal_type(e)  # revealed: Literal[True]

Falsy values

a = bool(0)
b = bool(())
c = bool(None)
d = bool("")
e = bool(False)
f = bool()

reveal_type(a)  # revealed: Literal[False]
reveal_type(b)  # revealed: Literal[False]
reveal_type(c)  # revealed: Literal[False]
reveal_type(d)  # revealed: Literal[False]
reveal_type(e)  # revealed: Literal[False]
reveal_type(f)  # revealed: Literal[False]

Ambiguous values

a = bool([])
b = bool({})
c = bool(set())

reveal_type(a)  # revealed: bool
reveal_type(b)  # revealed: bool
reveal_type(c)  # revealed: bool