Skip to content

Commit af2ce28

Browse files
builtins: do the TODO on compile() (#9567)
1 parent 6ac24ed commit af2ce28

File tree

1 file changed

+68
-5
lines changed

1 file changed

+68
-5
lines changed

stdlib/builtins.pyi

Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,27 +1220,90 @@ if sys.version_info >= (3, 10):
12201220
@overload
12211221
async def anext(__i: SupportsAnext[_T], default: _VT) -> _T | _VT: ...
12221222

1223-
# TODO: `compile` has a more precise return type in reality; work on a way of expressing that?
1223+
# compile() returns a CodeType, unless the flags argument includes PyCF_ONLY_AST (=1024),
1224+
# in which case it returns ast.AST. We have overloads for flag 0 (the default) and for
1225+
# explicitly passing PyCF_ONLY_AST. We fall back to Any for other values of flags.
12241226
if sys.version_info >= (3, 8):
1227+
@overload
12251228
def compile(
12261229
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
12271230
filename: str | ReadableBuffer | _PathLike[Any],
12281231
mode: str,
1229-
flags: int = 0,
1232+
flags: Literal[0],
1233+
dont_inherit: int = False,
1234+
optimize: int = -1,
1235+
*,
1236+
_feature_version: int = -1,
1237+
) -> CodeType: ...
1238+
@overload
1239+
def compile(
1240+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1241+
filename: str | ReadableBuffer | _PathLike[Any],
1242+
mode: str,
1243+
*,
1244+
dont_inherit: int = False,
1245+
optimize: int = -1,
1246+
_feature_version: int = -1,
1247+
) -> CodeType: ...
1248+
@overload
1249+
def compile(
1250+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1251+
filename: str | ReadableBuffer | _PathLike[Any],
1252+
mode: str,
1253+
flags: Literal[1024],
1254+
dont_inherit: int = False,
1255+
optimize: int = -1,
1256+
*,
1257+
_feature_version: int = -1,
1258+
) -> _ast.AST: ...
1259+
@overload
1260+
def compile(
1261+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1262+
filename: str | ReadableBuffer | _PathLike[Any],
1263+
mode: str,
1264+
flags: int,
12301265
dont_inherit: int = False,
12311266
optimize: int = -1,
12321267
*,
12331268
_feature_version: int = -1,
12341269
) -> Any: ...
12351270

12361271
else:
1272+
@overload
1273+
def compile(
1274+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1275+
filename: str | ReadableBuffer | _PathLike[Any],
1276+
mode: str,
1277+
flags: Literal[0],
1278+
dont_inherit: int = False,
1279+
optimize: int = -1,
1280+
) -> CodeType: ...
1281+
@overload
1282+
def compile(
1283+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1284+
filename: str | ReadableBuffer | _PathLike[Any],
1285+
mode: str,
1286+
*,
1287+
dont_inherit: int = False,
1288+
optimize: int = -1,
1289+
) -> CodeType: ...
1290+
@overload
12371291
def compile(
12381292
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
12391293
filename: str | ReadableBuffer | _PathLike[Any],
12401294
mode: str,
1241-
flags: int = ...,
1242-
dont_inherit: int = ...,
1243-
optimize: int = ...,
1295+
flags: Literal[1024],
1296+
dont_inherit: int = False,
1297+
optimize: int = -1,
1298+
) -> _ast.AST: ...
1299+
@overload
1300+
def compile(
1301+
source: str | ReadableBuffer | _ast.Module | _ast.Expression | _ast.Interactive,
1302+
filename: str | ReadableBuffer | _PathLike[Any],
1303+
mode: str,
1304+
flags: int,
1305+
dont_inherit: int = False,
1306+
optimize: int = -1,
12441307
) -> Any: ...
12451308

12461309
def copyright() -> None: ...

0 commit comments

Comments
 (0)