@@ -157,62 +157,84 @@ def test_annotations(self):
157
157
eq ('True or False or None' )
158
158
eq ('True and False' )
159
159
eq ('True and False and None' )
160
- eq ('(Name1 and Name2) or Name3' )
161
- eq ('Name1 or (Name2 and Name3)' )
162
- eq ('(Name1 and Name2) or (Name3 and Name4)' )
163
- eq ('Name1 or (Name2 and Name3) or Name4' )
160
+ eq ('Name1 and Name2 or Name3' )
161
+ eq ('Name1 and (Name2 or Name3)' )
162
+ eq ('Name1 or Name2 and Name3' )
163
+ eq ('(Name1 or Name2) and Name3' )
164
+ eq ('Name1 and Name2 or Name3 and Name4' )
165
+ eq ('Name1 or Name2 and Name3 or Name4' )
166
+ eq ('a + b + (c + d)' )
167
+ eq ('a * b * (c * d)' )
168
+ eq ('(a ** b) ** c ** d' )
164
169
eq ('v1 << 2' )
165
170
eq ('1 >> v2' )
166
- eq (r '1 % finished' )
167
- eq ('(( 1 + v2) - ( v3 * 4)) ^ ((( 5 ** v6) / 7) // 8) ' )
171
+ eq ('1 % finished' )
172
+ eq ('1 + v2 - v3 * 4 ^ 5 ** v6 / 7 // 8' )
168
173
eq ('not great' )
174
+ eq ('not not great' )
169
175
eq ('~great' )
170
176
eq ('+value' )
177
+ eq ('++value' )
171
178
eq ('-1' )
172
- eq ('(~int) and (not ((v1 ^ (123 + v2)) | True))' )
179
+ eq ('~int and not v1 ^ 123 + v2 | True' )
180
+ eq ('a + (not b)' )
173
181
eq ('lambda arg: None' )
174
182
eq ('lambda a=True: a' )
175
183
eq ('lambda a, b, c=True: a' )
176
- eq ("lambda a, b, c=True, *, d=(1 << v2), e='str': a" )
177
- eq ("lambda a, b, c=True, *vararg, d=(v1 << 2), e='str', **kwargs: a + b" )
184
+ eq ("lambda a, b, c=True, *, d=1 << v2, e='str': a" )
185
+ eq ("lambda a, b, c=True, *vararg, d=v1 << 2, e='str', **kwargs: a + b" )
186
+ eq ('lambda x: lambda y: x + y' )
178
187
eq ('1 if True else 2' )
179
- eq ('(str or None) if True else (str or bytes or None)' )
180
- eq ('(str or None) if (1 if True else 2) else (str or bytes or None)' )
181
- eq ("{'2.7': dead, '3.7': (long_live or die_hard)}" )
182
- eq ("{'2.7': dead, '3.7': (long_live or die_hard), **{'3.6': verygood}}" )
188
+ eq ('str or None if int or True else str or bytes or None' )
189
+ eq ('str or None if (1 if True else 2) else str or bytes or None' )
190
+ eq ("0 if not x else 1 if x > 0 else -1" )
191
+ eq ("(1 if x > 0 else -1) if x else 0" )
192
+ eq ("{'2.7': dead, '3.7': long_live or die_hard}" )
193
+ eq ("{'2.7': dead, '3.7': long_live or die_hard, **{'3.6': verygood}}" )
183
194
eq ("{**a, **b, **c}" )
184
- eq ("{'2.7', '3.6', '3.7', '3.8', '3.9', ('4.0' if gilectomy else '3.10')}" )
185
- eq ("({'a': 'b'}, (True or False), (+value), 'string', b'bytes') or None" )
195
+ eq ("{'2.7', '3.6', '3.7', '3.8', '3.9', '4.0' if gilectomy else '3.10'}" )
196
+ eq ("{*a, *b, *c}" )
197
+ eq ("({'a': 'b'}, True or False, +value, 'string', b'bytes') or None" )
186
198
eq ("()" )
187
- eq ("(1,)" )
188
- eq ("(1, 2)" )
189
- eq ("(1, 2, 3)" )
199
+ eq ("(a,)" )
200
+ eq ("(a, b)" )
201
+ eq ("(a, b, c)" )
202
+ eq ("(*a, *b, *c)" )
190
203
eq ("[]" )
191
- eq ("[1, 2, 3, 4, 5, 6, 7, 8, 9, (10 or A), (11 or B), (12 or C)]" )
204
+ eq ("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]" )
205
+ eq ("[*a, *b, *c]" )
192
206
eq ("{i for i in (1, 2, 3)}" )
193
- eq ("{( i ** 2) for i in (1, 2, 3)}" )
194
- eq ("{( i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))}" )
195
- eq ("{(( i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3)}" )
207
+ eq ("{i ** 2 for i in (1, 2, 3)}" )
208
+ eq ("{i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))}" )
209
+ eq ("{i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)}" )
196
210
eq ("[i for i in (1, 2, 3)]" )
197
- eq ("[(i ** 2) for i in (1, 2, 3)]" )
198
- eq ("[(i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))]" )
199
- eq ("[((i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3)]" )
200
- eq (r"{i: 0 for i in (1, 2, 3)}" )
211
+ eq ("[i ** 2 for i in (1, 2, 3)]" )
212
+ eq ("[i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))]" )
213
+ eq ("[i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)]" )
214
+ eq ("(i for i in (1, 2, 3))" )
215
+ eq ("(i ** 2 for i in (1, 2, 3))" )
216
+ eq ("(i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c')))" )
217
+ eq ("(i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3))" )
218
+ eq ("{i: 0 for i in (1, 2, 3)}" )
201
219
eq ("{i: j for i, j in ((1, 'a'), (2, 'b'), (3, 'c'))}" )
220
+ eq ("[(x, y) for x, y in (a, b)]" )
221
+ eq ("[(x,) for x, in (a,)]" )
202
222
eq ("Python3 > Python2 > COBOL" )
203
223
eq ("Life is Life" )
204
224
eq ("call()" )
205
225
eq ("call(arg)" )
206
226
eq ("call(kwarg='hey')" )
207
227
eq ("call(arg, kwarg='hey')" )
208
- eq ("call(arg, another, kwarg='hey', **kwargs)" )
228
+ eq ("call(arg, *args, another, kwarg='hey')" )
229
+ eq ("call(arg, another, kwarg='hey', **kwargs, kwarg2='ho')" )
209
230
eq ("lukasz.langa.pl" )
210
231
eq ("call.me(maybe)" )
211
232
eq ("1 .real" )
212
233
eq ("1.0 .real" )
213
234
eq ("....__class__" )
214
235
eq ("list[str]" )
215
236
eq ("dict[str, int]" )
237
+ eq ("set[str,]" )
216
238
eq ("tuple[str, ...]" )
217
239
eq ("tuple[str, int, float, dict[str, int]]" )
218
240
eq ("slice[0]" )
@@ -222,49 +244,28 @@ def test_annotations(self):
222
244
eq ("slice[:-1]" )
223
245
eq ("slice[1:]" )
224
246
eq ("slice[::-1]" )
225
- eq ('(str or None) if (sys.version_info[0] > (3,)) else (str or bytes or None)' )
247
+ eq ("slice[()]" )
248
+ eq ("slice[a, b:c, d:e:f]" )
249
+ eq ("slice[(x for x in a)]" )
250
+ eq ('str or None if sys.version_info[0] > (3,) else str or bytes or None' )
226
251
eq ("f'f-string without formatted values is just a string'" )
227
252
eq ("f'{{NOT a formatted value}}'" )
228
253
eq ("f'some f-string with {a} {few():.2f} {formatted.values!r}'" )
229
254
eq ('''f"{f'{nested} inner'} outer"''' )
230
255
eq ("f'space between opening braces: { {a for a in (1, 2, 3)}}'" )
231
-
232
- def test_annotations_inexact (self ):
233
- """Source formatting is not always preserved
234
-
235
- This is due to reconstruction from AST. We *need to* put the parens
236
- in nested expressions because we don't know if the source code
237
- had them in the first place or not.
238
- """
239
- eq = partial (self .assertAnnotationEqual , drop_parens = True )
240
- eq ('Name1 and Name2 or Name3' )
241
- eq ('Name1 or Name2 and Name3' )
242
- eq ('Name1 and Name2 or Name3 and Name4' )
243
- eq ('Name1 or Name2 and Name3 or Name4' )
244
- eq ('1 + v2 - v3 * 4 ^ v5 ** 6 / 7 // 8' )
245
- eq ('~int and not v1 ^ 123 + v2 | True' )
246
- eq ('str or None if True else str or bytes or None' )
247
- eq ("{'2.7': dead, '3.7': long_live or die_hard}" )
248
- eq ("{'2.7', '3.6', '3.7', '3.8', '3.9', '4.0' if gilectomy else '3.10'}" )
249
- eq ("[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]" )
250
- # Consequently, we always drop unnecessary parens if they were given in
251
- # the outer scope:
252
- some_name = self .getActual ("(SomeName)" )
253
- self .assertEqual (some_name , 'SomeName' )
254
- # Interestingly, in the case of tuples (and generator expressions) the
255
- # parens are *required* by the Python syntax in the annotation context.
256
- # But there's no point storing that detail in __annotations__ so we're
257
- # fine with the parens-less form.
258
- eq = partial (self .assertAnnotationEqual , is_tuple = True )
259
- eq ("(Good, Bad, Ugly)" )
260
- eq ("(i for i in (1, 2, 3))" )
261
- eq ("((i ** 2) for i in (1, 2, 3))" )
262
- eq ("((i ** 2) for i, _ in ((1, 'a'), (2, 'b'), (3, 'c')))" )
263
- eq ("(((i ** 2) + j) for i in (1, 2, 3) for j in (1, 2, 3))" )
264
- eq ("(*starred)" )
256
+ eq ("f'{(lambda x: x)}'" )
257
+ eq ("f'{(None if a else lambda x: x)}'" )
265
258
eq ('(yield from outside_of_generator)' )
266
259
eq ('(yield)' )
267
- eq ('(await some.complicated[0].call(with_args=(True or (1 is not 1))))' )
260
+ eq ('(yield a + b)' )
261
+ eq ('await some.complicated[0].call(with_args=True or 1 is not 1)' )
262
+ eq ('[x for x in (a if b else c)]' )
263
+ eq ('[x for x in a if (b if c else d)]' )
264
+ eq ('f(x for x in a)' )
265
+ eq ('f(1, (x for x in a))' )
266
+ eq ('f((x for x in a), 2)' )
267
+ eq ('(((a)))' , 'a' )
268
+ eq ('(((a, b)))' , '(a, b)' )
268
269
269
270
270
271
if __name__ == "__main__" :
0 commit comments