Skip to content

Commit

Permalink
pythongh-119180: Rename parameter to __annotate__ functions
Browse files Browse the repository at this point in the history
Larry Hastings pointed out that using an illegal parameter name makes
it impossible to use inspect.signature() on annotate functions.

Cross-ref python/peps#3993.
  • Loading branch information
JelleZijlstra committed Sep 24, 2024
1 parent 17b3bc9 commit f768678
Show file tree
Hide file tree
Showing 7 changed files with 15 additions and 12 deletions.
1 change: 0 additions & 1 deletion Include/internal/pycore_global_objects_fini_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Include/internal/pycore_global_strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ struct _Py_global_strings {
STRUCT_FOR_STR(defaults, ".defaults")
STRUCT_FOR_STR(dot_locals, ".<locals>")
STRUCT_FOR_STR(empty, "")
STRUCT_FOR_STR(format, ".format")
STRUCT_FOR_STR(generic_base, ".generic_base")
STRUCT_FOR_STR(json_decoder, "json.decoder")
STRUCT_FOR_STR(kwdefaults, ".kwdefaults")
Expand Down
1 change: 0 additions & 1 deletion Include/internal/pycore_runtime_init_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 0 additions & 4 deletions Include/internal/pycore_unicodeobject_generated.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions Lib/test/test_type_annotations.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import annotationlib
import inspect
import textwrap
import types
import unittest
Expand Down Expand Up @@ -266,6 +267,17 @@ def check_annotations(self, f):
f.__annotations__ = {"z": 43}
self.assertIs(f.__annotate__, None)

def test_annotate_function_signature(self):
def f(x: int): pass
anno = f.__annotate__
self.assertIsInstance(anno, types.FunctionType)
self.assertEqual(f.__name__, "__annotate__")

expected_sig = inspect.Signature(
[inspect.Parameter("__format__", inspect.Parameter.POSITIONAL_ONLY)]
)
self.assertEqual(inspect.signature(anno), expected_sig)


class DeferredEvaluationTests(unittest.TestCase):
def test_function(self):
Expand Down
3 changes: 1 addition & 2 deletions Python/codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,8 +655,7 @@ codegen_setup_annotations_scope(compiler *c, location loc,
codegen_enter_scope(c, name, COMPILE_SCOPE_ANNOTATIONS,
key, loc.lineno, NULL, &umd));

// if .format != 1: raise NotImplementedError
_Py_DECLARE_STR(format, ".format");
// if __format__ != 1: raise NotImplementedError
ADDOP_I(c, loc, LOAD_FAST, 0);
ADDOP_LOAD_CONST(c, loc, _PyLong_GetOne());
ADDOP_I(c, loc, COMPARE_OP, (Py_NE << 5) | compare_masks[Py_NE]);
Expand Down
5 changes: 2 additions & 3 deletions Python/symtable.c
Original file line number Diff line number Diff line change
Expand Up @@ -1427,12 +1427,11 @@ symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block,
int result = symtable_enter_existing_block(st, ste);
Py_DECREF(ste);
if (block == AnnotationBlock || block == TypeVariableBlock || block == TypeAliasBlock) {
_Py_DECLARE_STR(format, ".format");
// We need to insert code that reads this "parameter" to the function.
if (!symtable_add_def(st, &_Py_STR(format), DEF_PARAM, loc)) {
if (!symtable_add_def(st, &_Py_ID(__format__), DEF_PARAM, loc)) {
return 0;
}
if (!symtable_add_def(st, &_Py_STR(format), USE, loc)) {
if (!symtable_add_def(st, &_Py_ID(__format__), USE, loc)) {
return 0;
}
}
Expand Down

0 comments on commit f768678

Please sign in to comment.