# Test interning qstrs that go over the limit of the maximum qstr length # (which is 255 bytes for the default configuration) def make_id(n, base='a'): return ''.join(chr(ord(base) + i % 26) for i in range(n)) # identifiers in parser for l in range(254, 259): g = {} var = make_id(l) try: exec(var + '=1', g) except RuntimeError: print('RuntimeError', l) continue print(var in g) # calling a function with kwarg def f(**k): print(k) for l in range(254, 259): try: exec('f({}=1)'.format(make_id(l))) except RuntimeError: print('RuntimeError', l) # type construction for l in range(254, 259): id = make_id(l) try: print(type(id, (), {}).__name__) except RuntimeError: print('RuntimeError', l) # hasattr, setattr, getattr class A: pass for l in range(254, 259): id = make_id(l) a = A() try: setattr(a, id, 123) except RuntimeError: print('RuntimeError', l) try: print(hasattr(a, id), getattr(a, id)) except RuntimeError: print('RuntimeError', l) # format with keys for l in range(254, 259): id = make_id(l) try: print(('{' + id + '}').format(**{id: l})) except RuntimeError: print('RuntimeError', l) # modulo format with keys for l in range(254, 259): id = make_id(l) try: print(('%(' + id + ')d') % {id: l}) except RuntimeError: print('RuntimeError', l) # import module # (different OS's have different results so only run those that are consistent) for l in (100, 101, 256, 257, 258): try: __import__(make_id(l)) except ImportError: print('ok', l) except RuntimeError: print('RuntimeError', l) # import package for l in (100, 101, 102, 128, 129): try: exec('import ' + make_id(l) + '.' + make_id(l, 'A')) except ImportError: print('ok', l) except RuntimeError: print('RuntimeError', l)