-
-
Notifications
You must be signed in to change notification settings - Fork 32.3k
bpo-30296 Remove unnecessary tuples, lists, sets, and dicts #1489
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -369,8 +369,8 @@ def groups(self): | |
@property | ||
def addresses(self): | ||
if self._addresses is None: | ||
self._addresses = tuple([address for group in self._groups | ||
for address in group.addresses]) | ||
self._addresses = tuple(address for group in self._groups | ||
for address in group.addresses) | ||
return self._addresses | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The original variant, with list comprehension, is faster than the variant with a generator. The difference is up to 2 times for simple tests. I would keep the original code. |
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -389,7 +389,7 @@ def classify_class_attrs(cls): | |
|
||
mro = getmro(cls) | ||
metamro = getmro(type(cls)) # for attributes stored in the metaclass | ||
metamro = tuple([cls for cls in metamro if cls not in (type, object)]) | ||
metamro = tuple(cls for cls in metamro if cls not in (type, object)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, this one is fine. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
class_bases = (cls,) + mro | ||
all_bases = class_bases + metamro | ||
names = dir(cls) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -463,7 +463,7 @@ def configure_custom(self, config): | |
c = self.resolve(c) | ||
props = config.pop('.', None) | ||
# Check for valid identifiers | ||
kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) | ||
kwargs = dict((k, config[k]) for k in config if valid_ident(k)) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would use a dict comprehension. And the same for other change in this file. |
||
result = c(**kwargs) | ||
if props: | ||
for name, value in props.items(): | ||
|
@@ -726,7 +726,7 @@ def configure_handler(self, config): | |
config['address'] = self.as_tuple(config['address']) | ||
factory = klass | ||
props = config.pop('.', None) | ||
kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) | ||
kwargs = dict((k, config[k]) for k in config if valid_ident(k)) | ||
try: | ||
result = factory(**kwargs) | ||
except TypeError as te: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -261,7 +261,7 @@ def get_all_start_methods(self): | |
else: | ||
return ['fork', 'spawn'] | ||
|
||
DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_') | ||
DefaultContext.__all__ = [x for x in dir(DefaultContext) if x[0] != '_'] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. |
||
|
||
# | ||
# Context types for fixed start method | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -98,8 +98,7 @@ def ensure_running(self): | |
if self._preload_modules: | ||
desired_keys = {'main_path', 'sys_path'} | ||
data = spawn.get_preparation_data('ignore') | ||
data = dict((x,y) for (x,y) in data.items() | ||
if x in desired_keys) | ||
data = {x: y for x, y in data.items() if x in desired_keys} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm ambivalent about this one. |
||
else: | ||
data = {} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -115,7 +115,7 @@ def synchronized(obj, lock=None, ctx=None): | |
scls = class_cache[cls] | ||
except KeyError: | ||
names = [field[0] for field in cls._fields_] | ||
d = dict((name, make_property(name)) for name in names) | ||
d = {name: make_property(name) for name in names} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. |
||
classname = 'Synchronized' + cls.__name__ | ||
scls = class_cache[cls] = type(classname, (SynchronizedBase,), d) | ||
return scls(obj, lock, ctx) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -500,8 +500,7 @@ def add_callers(target, source): | |
if func in new_callers: | ||
if isinstance(caller, tuple): | ||
# format used by cProfile | ||
new_callers[func] = tuple([i[0] + i[1] for i in | ||
zip(caller, new_callers[func])]) | ||
new_callers[func] = tuple(i[0] + i[1] for i in zip(caller, new_callers[func])) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. Maybe unpack a tuple:
|
||
else: | ||
# format used by profile | ||
new_callers[func] += caller | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -119,8 +119,8 @@ class Function(SymbolTable): | |
__globals = None | ||
|
||
def __idents_matching(self, test_func): | ||
return tuple([ident for ident in self.get_identifiers() | ||
if test_func(self._table.symbols[ident])]) | ||
return tuple(ident for ident in self.get_identifiers() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
if test_func(self._table.symbols[ident])) | ||
|
||
def get_parameters(self): | ||
if self.__params is None: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -142,7 +142,7 @@ def _all_string_prefixes(): | |
# 'rf'). The various permutations will be generated. | ||
_valid_string_prefixes = ['b', 'r', 'u', 'f', 'br', 'fr'] | ||
# if we add binary f-strings, add: ['fb', 'fbr'] | ||
result = set(['']) | ||
result = {''} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. Set literals are almost always the right thing to do. My only misgiving is that the new code looks like an ascii emoticon. |
||
for prefix in _valid_string_prefixes: | ||
for t in _itertools.permutations(prefix): | ||
# create a list with upper and lower versions of each | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -253,8 +253,7 @@ def __init__(self, filename, lineno, name, *, lookup_line=True, | |
self._line = line | ||
if lookup_line: | ||
self.line | ||
self.locals = \ | ||
dict((k, repr(v)) for k, v in locals.items()) if locals else None | ||
self.locals = {k: repr(v) for k, v in locals.items()} if locals else None | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. |
||
|
||
def __eq__(self, other): | ||
if isinstance(other, FrameSummary): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1175,7 +1175,7 @@ def _color(self, cstr): | |
cl = [16*int(cstr[h], 16) for h in cstr[1:]] | ||
else: | ||
raise TurtleGraphicsError("bad colorstring: %s" % cstr) | ||
return tuple([c * self._colormode/255 for c in cl]) | ||
return tuple(c * self._colormode/255 for c in cl) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
|
||
def colormode(self, cmode=None): | ||
"""Return the colormode or set it to 1.0 or 255. | ||
|
@@ -2989,7 +2989,7 @@ def _getshapepoly(self, polygon, compound=False): | |
t11, t12, t21, t22 = l, 0, 0, l | ||
elif self._resizemode == "noresize": | ||
return polygon | ||
return tuple([(t11*x + t12*y, t21*x + t22*y) for (x, y) in polygon]) | ||
return tuple((t11*x + t12*y, t21*x + t22*y) for (x, y) in polygon) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
|
||
def _drawturtle(self): | ||
"""Manages the correct rendering of the turtle with respect to | ||
|
@@ -3839,8 +3839,8 @@ def write_docstringdict(filename="turtle_docstringdict"): | |
docsdict[key] = eval(key).__doc__ | ||
|
||
with open("%s.py" % filename,"w") as f: | ||
keys = sorted([x for x in docsdict.keys() | ||
if x.split('.')[1] not in _alias_list]) | ||
keys = sorted(x for x in docsdict.keys() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
if x.split('.')[1] not in _alias_list) | ||
f.write('docsdict = {\n\n') | ||
for key in keys[:-1]: | ||
f.write('%s :\n' % repr(key)) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -52,7 +52,7 @@ def main(): | |
sleep(1) | ||
|
||
at = clock() | ||
while any([t.undobufferentries() for t in s.turtles()]): | ||
while any(t.undobufferentries() for t in s.turtles()): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. |
||
for t in s.turtles(): | ||
t.undo() | ||
et = clock() | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -683,8 +683,8 @@ def redirect_request(self, req, fp, code, msg, headers, newurl): | |
newurl = newurl.replace(' ', '%20') | ||
|
||
CONTENT_HEADERS = ("content-length", "content-type") | ||
newheaders = dict((k, v) for k, v in req.headers.items() | ||
if k.lower() not in CONTENT_HEADERS) | ||
newheaders = {k: v for k, v in req.headers.items() | ||
if k.lower() not in CONTENT_HEADERS} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm ambivalent about this one. |
||
return Request(newurl, | ||
headers=newheaders, | ||
origin_req_host=req.origin_req_host, | ||
|
@@ -845,7 +845,7 @@ def add_password(self, realm, uri, user, passwd): | |
self.passwd[realm] = {} | ||
for default_port in True, False: | ||
reduced_uri = tuple( | ||
[self.reduce_uri(u, default_port) for u in uri]) | ||
self.reduce_uri(u, default_port) for u in uri) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
self.passwd[realm][reduced_uri] = (user, passwd) | ||
|
||
def find_user_password(self, realm, authuri): | ||
|
@@ -1286,8 +1286,7 @@ def do_open(self, http_class, req, **http_conn_args): | |
h.set_debuglevel(self._debuglevel) | ||
|
||
headers = dict(req.unredirected_hdrs) | ||
headers.update(dict((k, v) for k, v in req.headers.items() | ||
if k not in headers)) | ||
headers.update((k, v) for k, v in req.headers.items() if k not in headers) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This changes the semantic. Updated I would use a dict comprehesion. |
||
|
||
# TODO(jhylton): Should this be redesigned to handle | ||
# persistent connections? | ||
|
@@ -1299,7 +1298,7 @@ def do_open(self, http_class, req, **http_conn_args): | |
# So make sure the connection gets closed after the (only) | ||
# request. | ||
headers["Connection"] = "close" | ||
headers = dict((name.title(), val) for name, val in headers.items()) | ||
headers = {name.title(): val for name, val in headers.items()} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. Sometimes the dict() form is clearer about its intention but in this case the colon form for the key/value is clearer than the (key, value) form. |
||
|
||
if req._tunnel_host: | ||
tunnel_headers = {} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1097,8 +1097,8 @@ def proxyval(self, visited): | |
return ProxyAlreadyVisited('(...)') | ||
visited.add(self.as_address()) | ||
|
||
result = tuple([PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited) | ||
for i in safe_range(int_from_int(self.field('ob_size')))]) | ||
result = tuple(PyObjectPtr.from_pyobject_ptr(self[i]).proxyval(visited) | ||
for i in safe_range(int_from_int(self.field('ob_size')))) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would keep the original code. |
||
return result | ||
|
||
def write_repr(self, out, visited): | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -609,7 +609,7 @@ def makeunicodename(unicode, trace): | |
if name and name[0] != "<": | ||
names[char] = name + chr(0) | ||
|
||
print(len(list(n for n in names if n is not None)), "distinct names") | ||
print(len([n for n in names if n is not None]), "distinct names") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is okay |
||
|
||
# collect unique words from names (note that we differ between | ||
# words inside a sentence, and words ending a sentence. the | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes to this one. Set literals are always a win.