@@ -1038,18 +1038,32 @@ def some():
1038
1038
_testcapi .function_get_module (None ) # not a function
1039
1039
1040
1040
def test_function_get_defaults (self ):
1041
- def some (pos_only = 'p' , zero = 0 , optional = None ):
1041
+ def some (
1042
+ pos_only1 , pos_only2 = 'p' ,
1043
+ / ,
1044
+ zero = 0 , optional = None ,
1045
+ * ,
1046
+ kw1 ,
1047
+ kw2 = True ,
1048
+ ):
1042
1049
pass
1043
1050
1044
1051
defaults = _testcapi .function_get_defaults (some )
1045
1052
self .assertEqual (defaults , ('p' , 0 , None ))
1046
1053
self .assertEqual (defaults , some .__defaults__ )
1047
1054
1048
1055
with self .assertRaises (SystemError ):
1049
- _testcapi .function_get_module (None ) # not a function
1056
+ _testcapi .function_get_defaults (None ) # not a function
1050
1057
1051
1058
def test_function_set_defaults (self ):
1052
- def some (pos_only = 'p' , zero = 0 , optional = None ):
1059
+ def some (
1060
+ pos_only1 , pos_only2 = 'p' ,
1061
+ / ,
1062
+ zero = 0 , optional = None ,
1063
+ * ,
1064
+ kw1 ,
1065
+ kw2 = True ,
1066
+ ):
1053
1067
pass
1054
1068
1055
1069
old_defaults = ('p' , 0 , None )
@@ -1061,11 +1075,22 @@ def some(pos_only='p', zero=0, optional=None):
1061
1075
self .assertEqual (_testcapi .function_get_defaults (some ), old_defaults )
1062
1076
self .assertEqual (some .__defaults__ , old_defaults )
1063
1077
1078
+ with self .assertRaises (SystemError ):
1079
+ _testcapi .function_set_defaults (1 , ()) # not a function
1080
+ self .assertEqual (_testcapi .function_get_defaults (some ), old_defaults )
1081
+ self .assertEqual (some .__defaults__ , old_defaults )
1082
+
1064
1083
new_defaults = ('q' , 1 , None )
1065
1084
_testcapi .function_set_defaults (some , new_defaults )
1066
1085
self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
1067
1086
self .assertEqual (some .__defaults__ , new_defaults )
1068
1087
1088
+ # Empty tuple is fine:
1089
+ new_defaults = ()
1090
+ _testcapi .function_set_defaults (some , new_defaults )
1091
+ self .assertEqual (_testcapi .function_get_defaults (some ), new_defaults )
1092
+ self .assertEqual (some .__defaults__ , new_defaults )
1093
+
1069
1094
class tuplesub (tuple ): ... # tuple subclasses must work
1070
1095
1071
1096
new_defaults = tuplesub (((1 , 2 ), ['a' , 'b' ], None ))
@@ -1079,6 +1104,73 @@ class tuplesub(tuple): ... # tuple subclasses must work
1079
1104
self .assertEqual (_testcapi .function_get_defaults (some ), None )
1080
1105
self .assertEqual (some .__defaults__ , None )
1081
1106
1107
+ def test_function_get_kw_defaults (self ):
1108
+ def some (
1109
+ pos_only1 , pos_only2 = 'p' ,
1110
+ / ,
1111
+ zero = 0 , optional = None ,
1112
+ * ,
1113
+ kw1 ,
1114
+ kw2 = True ,
1115
+ ):
1116
+ pass
1117
+
1118
+ defaults = _testcapi .function_get_kw_defaults (some )
1119
+ self .assertEqual (defaults , {'kw2' : True })
1120
+ self .assertEqual (defaults , some .__kwdefaults__ )
1121
+
1122
+ with self .assertRaises (SystemError ):
1123
+ _testcapi .function_get_kw_defaults (None ) # not a function
1124
+
1125
+ def test_function_set_kw_defaults (self ):
1126
+ def some (
1127
+ pos_only1 , pos_only2 = 'p' ,
1128
+ / ,
1129
+ zero = 0 , optional = None ,
1130
+ * ,
1131
+ kw1 ,
1132
+ kw2 = True ,
1133
+ ):
1134
+ pass
1135
+
1136
+ old_defaults = {'kw2' : True }
1137
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), old_defaults )
1138
+ self .assertEqual (some .__kwdefaults__ , old_defaults )
1139
+
1140
+ with self .assertRaises (SystemError ):
1141
+ _testcapi .function_set_kw_defaults (some , 1 ) # not dict or None
1142
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), old_defaults )
1143
+ self .assertEqual (some .__kwdefaults__ , old_defaults )
1144
+
1145
+ with self .assertRaises (SystemError ):
1146
+ _testcapi .function_set_kw_defaults (1 , {}) # not a function
1147
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), old_defaults )
1148
+ self .assertEqual (some .__kwdefaults__ , old_defaults )
1149
+
1150
+ new_defaults = {'kw2' : (1 , 2 , 3 )}
1151
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1152
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1153
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1154
+
1155
+ # Empty dict is fine:
1156
+ new_defaults = {}
1157
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1158
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1159
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1160
+
1161
+ class dictsub (dict ): ... # dict subclasses must work
1162
+
1163
+ new_defaults = dictsub ({'kw2' : None })
1164
+ _testcapi .function_set_kw_defaults (some , new_defaults )
1165
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), new_defaults )
1166
+ self .assertEqual (some .__kwdefaults__ , new_defaults )
1167
+
1168
+ # `None` is special, it sets `kwdefaults` to `NULL`,
1169
+ # it needs special handling in `_testcapi`:
1170
+ _testcapi .function_set_kw_defaults (some , None )
1171
+ self .assertEqual (_testcapi .function_get_kw_defaults (some ), None )
1172
+ self .assertEqual (some .__kwdefaults__ , None )
1173
+
1082
1174
1083
1175
class TestPendingCalls (unittest .TestCase ):
1084
1176
0 commit comments