@@ -942,6 +942,48 @@ def some():
942
942
with self .assertRaises (SystemError ):
943
943
_testcapi .function_get_module (None ) # not a function
944
944
945
+ def test_function_get_defaults (self ):
946
+ def some (pos_only = 'p' , zero = 0 , optional = None ):
947
+ pass
948
+
949
+ defaults = _testcapi .function_get_defaults (some )
950
+ self .assertEqual (defaults , ('p' , 0 , None ))
951
+ self .assertEqual (defaults , some .__defaults__ )
952
+
953
+ with self .assertRaises (SystemError ):
954
+ _testcapi .function_get_module (None ) # not a function
955
+
956
+ def test_function_set_defaults (self ):
957
+ def some (pos_only = 'p' , zero = 0 , optional = None ):
958
+ pass
959
+
960
+ old_defaults = ('p' , 0 , None )
961
+ self .assertEqual (_testcapi .function_get_defaults (some ), old_defaults )
962
+ self .assertEqual (some .__defaults__ , old_defaults )
963
+
964
+ with self .assertRaises (SystemError ):
965
+ _testcapi .function_set_defaults (some , 1 ) # not tuple or None
966
+ self .assertEqual (_testcapi .function_get_defaults (some ), old_defaults )
967
+ self .assertEqual (some .__defaults__ , old_defaults )
968
+
969
+ new_defaults = ('q' , 1 , None )
970
+ _testcapi .function_set_defaults (some , new_defaults )
971
+ self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
972
+ self .assertEqual (some .__defaults__ , new_defaults )
973
+
974
+ class tuplesub (tuple ): ... # tuple subclasses must work
975
+
976
+ new_defaults = tuplesub (((1 , 2 ), ['a' , 'b' ], None ))
977
+ _testcapi .function_set_defaults (some , new_defaults )
978
+ self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
979
+ self .assertEqual (some .__defaults__ , new_defaults )
980
+
981
+ # `None` is special, it sets `defaults` to `NULL`,
982
+ # it needs special handling in `_testcapi`:
983
+ _testcapi .function_set_defaults (some , None )
984
+ self .assertEqual (_testcapi .function_get_defaults (some ), None )
985
+ self .assertEqual (some .__defaults__ , None )
986
+
945
987
946
988
class TestPendingCalls (unittest .TestCase ):
947
989
0 commit comments