@@ -943,18 +943,32 @@ def some():
943
943
_testcapi .function_get_module (None ) # not a function
944
944
945
945
def test_function_get_defaults (self ):
946
- def some (pos_only = 'p' , zero = 0 , optional = None ):
946
+ def some (
947
+ pos_only1 , pos_only2 = 'p' ,
948
+ / ,
949
+ zero = 0 , optional = None ,
950
+ * ,
951
+ kw1 ,
952
+ kw2 = True ,
953
+ ):
947
954
pass
948
955
949
956
defaults = _testcapi .function_get_defaults (some )
950
957
self .assertEqual (defaults , ('p' , 0 , None ))
951
958
self .assertEqual (defaults , some .__defaults__ )
952
959
953
960
with self .assertRaises (SystemError ):
954
- _testcapi .function_get_module (None ) # not a function
961
+ _testcapi .function_get_defaults (None ) # not a function
955
962
956
963
def test_function_set_defaults (self ):
957
- def some (pos_only = 'p' , zero = 0 , optional = None ):
964
+ def some (
965
+ pos_only1 , pos_only2 = 'p' ,
966
+ / ,
967
+ zero = 0 , optional = None ,
968
+ * ,
969
+ kw1 ,
970
+ kw2 = True ,
971
+ ):
958
972
pass
959
973
960
974
old_defaults = ('p' , 0 , None )
@@ -963,6 +977,8 @@ def some(pos_only='p', zero=0, optional=None):
963
977
964
978
with self .assertRaises (SystemError ):
965
979
_testcapi .function_set_defaults (some , 1 ) # not tuple or None
980
+ with self .assertRaises (SystemError ):
981
+ _testcapi .function_set_defaults (1 , ()) # not a function
966
982
self .assertEqual (_testcapi .function_get_defaults (some ), old_defaults )
967
983
self .assertEqual (some .__defaults__ , old_defaults )
968
984
@@ -971,6 +987,12 @@ def some(pos_only='p', zero=0, optional=None):
971
987
self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
972
988
self .assertEqual (some .__defaults__ , new_defaults )
973
989
990
+ # Empty tuple is fine:
991
+ new_defaults = ()
992
+ _testcapi .function_set_defaults (some , new_defaults )
993
+ self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
994
+ self .assertEqual (some .__defaults__ , new_defaults )
995
+
974
996
class tuplesub (tuple ): ... # tuple subclasses must work
975
997
976
998
new_defaults = tuplesub (((1 , 2 ), ['a' , 'b' ], None ))
@@ -984,6 +1006,70 @@ class tuplesub(tuple): ... # tuple subclasses must work
984
1006
self .assertEqual (_testcapi .function_get_defaults (some ), None )
985
1007
self .assertEqual (some .__defaults__ , None )
986
1008
1009
+ def test_function_get_kw_defaults (self ):
1010
+ def some (
1011
+ pos_only1 , pos_only2 = 'p' ,
1012
+ / ,
1013
+ zero = 0 , optional = None ,
1014
+ * ,
1015
+ kw1 ,
1016
+ kw2 = True ,
1017
+ ):
1018
+ pass
1019
+
1020
+ defaults = _testcapi .function_get_kw_defaults (some )
1021
+ self .assertEqual (defaults , {'kw2' : True })
1022
+ self .assertEqual (defaults , some .__kwdefaults__ )
1023
+
1024
+ with self .assertRaises (SystemError ):
1025
+ _testcapi .function_get_kw_defaults (None ) # not a function
1026
+
1027
+ def test_function_set_kw_defaults (self ):
1028
+ def some (
1029
+ pos_only1 , pos_only2 = 'p' ,
1030
+ / ,
1031
+ zero = 0 , optional = None ,
1032
+ * ,
1033
+ kw1 ,
1034
+ kw2 = True ,
1035
+ ):
1036
+ pass
1037
+
1038
+ old_defaults = {'kw2' : True }
1039
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), old_defaults )
1040
+ self .assertEqual (some .__kwdefaults__ , old_defaults )
1041
+
1042
+ with self .assertRaises (SystemError ):
1043
+ _testcapi .function_set_kw_defaults (some , 1 ) # not dict or None
1044
+ with self .assertRaises (SystemError ):
1045
+ _testcapi .function_set_kw_defaults (1 , {}) # not a function
1046
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), old_defaults )
1047
+ self .assertEqual (some .__kwdefaults__ , old_defaults )
1048
+
1049
+ new_defaults = {'kw2' : (1 , 2 , 3 )}
1050
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1051
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1052
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1053
+
1054
+ # Empty dict is fine:
1055
+ new_defaults = {}
1056
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1057
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1058
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1059
+
1060
+ class dictsub (dict ): ... # dict subclasses must work
1061
+
1062
+ new_defaults = dictsub ({'kw2' : None })
1063
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1064
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1065
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1066
+
1067
+ # `None` is special, it sets `kwdefaults` to `NULL`,
1068
+ # it needs special handling in `_testcapi`:
1069
+ _testcapi .function_set_kw_defaults (some , None )
1070
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), None )
1071
+ self .assertEqual (some .__kwdefaults__ , None )
1072
+
987
1073
988
1074
class TestPendingCalls (unittest .TestCase ):
989
1075
0 commit comments