From cb6973cf44d0cf8594976e8a5cb680916e3c2a22 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Sun, 31 Oct 2021 10:04:07 +0100 Subject: [PATCH] Use sets instead of lists in conditionals --- installer/i18n/nshutil.py | 2 +- picard/cluster.py | 2 +- picard/formats/apev2.py | 12 ++++++------ picard/formats/asf.py | 2 +- picard/formats/id3.py | 2 +- picard/formats/mp4.py | 9 ++++----- picard/formats/mutagenext/compatid3.py | 2 +- picard/formats/vorbis.py | 4 ++-- picard/mbjson.py | 6 +++--- picard/metadata.py | 4 ++-- picard/script/functions.py | 2 +- picard/track.py | 2 +- picard/ui/coverartbox.py | 6 +++--- picard/ui/edittagdialog.py | 6 +++--- picard/ui/itemviews.py | 4 ++-- picard/ui/metadatabox.py | 4 ++-- picard/ui/widgets/editablelistview.py | 4 ++-- picard/ui/widgets/scripttextedit.py | 8 ++++---- picard/util/__init__.py | 4 ++-- picard/util/icontheme.py | 2 +- picard/util/imageinfo.py | 2 +- picard/version.py | 4 ++-- scripts/tools/fix-header.py | 2 +- setup.py | 4 ++-- test/formats/common.py | 2 +- 25 files changed, 50 insertions(+), 51 deletions(-) diff --git a/installer/i18n/nshutil.py b/installer/i18n/nshutil.py index b6d16978f..55768b24f 100644 --- a/installer/i18n/nshutil.py +++ b/installer/i18n/nshutil.py @@ -123,7 +123,7 @@ def code_to_language(language_code): def escape_string(text): for escape, char in ESCAPE_CHARS.items(): - if char in ("'", "`"): # No need to escape quotes other than "" + if char in {"'", "`"}: # No need to escape quotes other than "" continue text = text.replace(char, escape) return text diff --git a/picard/cluster.py b/picard/cluster.py index 0b2e4025e..fe9c600d1 100644 --- a/picard/cluster.py +++ b/picard/cluster.py @@ -233,7 +233,7 @@ class Cluster(FileList): def column(self, column): if column == 'title': return '%s (%d)' % (self.metadata['album'], len(self.files)) - elif self.special and (column in ['~length', 'album', 'covercount']): + elif self.special and column in {'~length', 'album', 'covercount'}: return '' elif column == '~length': return format_time(self.metadata.length) diff --git a/picard/formats/apev2.py b/picard/formats/apev2.py index 7789b5ade..48e9b4ab9 100644 --- a/picard/formats/apev2.py +++ b/picard/formats/apev2.py @@ -168,7 +168,7 @@ class APEv2File(File): if len(disc) > 1: metadata["totaldiscs"] = disc[1] value = disc[0] - elif name in ('performer', 'comment'): + elif name in {'performer', 'comment'}: if value.endswith(')'): start = value.rfind(' (') if start > 0: @@ -213,7 +213,7 @@ class APEv2File(File): elif name == 'discnumber': if 'totaldiscs' in metadata: value = '%s/%s' % (value, metadata['totaldiscs']) - elif name in ('totaltracks', 'totaldiscs'): + elif name in {'totaltracks', 'totaldiscs'}: continue # "performer:Piano=Joe Barr" => "Performer=Joe Barr (Piano)" elif name.startswith('performer:') or name.startswith('comment:'): @@ -239,7 +239,7 @@ class APEv2File(File): """Remove the tags from the file that were deleted in the UI""" for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) - if real_name in ('Lyrics', 'Comment', 'Performer'): + if real_name in {'Lyrics', 'Comment', 'Performer'}: parts = tag.split(':', 1) if len(parts) == 2: tag_type_regex = re.compile(r"\(%s\)$" % re.escape(parts[1])) @@ -250,7 +250,7 @@ class APEv2File(File): if re.search(tag_type_regex, item): existing_tags.remove(item) tags[real_name] = existing_tags - elif tag in ('totaltracks', 'totaldiscs'): + elif tag in {'totaltracks', 'totaldiscs'}: tagstr = real_name.lower() + 'number' if tagstr in metadata: tags[real_name] = metadata[tagstr] @@ -265,9 +265,9 @@ class APEv2File(File): return 'Lyrics' elif name == 'date': return 'Year' - elif name in ('tracknumber', 'totaltracks'): + elif name in {'tracknumber', 'totaltracks'}: return 'Track' - elif name in ('discnumber', 'totaldiscs'): + elif name in {'discnumber', 'totaldiscs'}: return 'Disc' elif name.startswith('performer:') or name.startswith('comment:'): return name.split(':', 1)[0].title() diff --git a/picard/formats/asf.py b/picard/formats/asf.py index e7ddb837d..7b5ed6931 100644 --- a/picard/formats/asf.py +++ b/picard/formats/asf.py @@ -310,7 +310,7 @@ class ASFFile(File): def supports_tag(cls, name): return (name in cls.__TRANS or name in cls.__TRANS_CI - or name in ('~rating', 'totaldiscs') + or name in {'~rating', 'totaldiscs'} or name.startswith('lyrics:')) def _get_tag_name(self, name): diff --git a/picard/formats/id3.py b/picard/formats/id3.py index 098effa1e..b8fa08f56 100644 --- a/picard/formats/id3.py +++ b/picard/formats/id3.py @@ -259,7 +259,7 @@ class ID3File(File): frameid = frame.FrameID if frameid in self.__translate: name = self.__translate[frameid] - if frameid.startswith('T') or frameid in ["GRP1", "MVNM"]: + if frameid.startswith('T') or frameid in {"GRP1", "MVNM"}: for text in frame.text: if text: metadata.add(name, text) diff --git a/picard/formats/mp4.py b/picard/formats/mp4.py index bf9ccc7c3..ec8ed5f17 100644 --- a/picard/formats/mp4.py +++ b/picard/formats/mp4.py @@ -216,8 +216,7 @@ class MP4File(File): log.debug('disk is invalid, ignoring') elif name == "covr": for value in values: - if value.imageformat not in (value.FORMAT_JPEG, - value.FORMAT_PNG): + if value.imageformat not in {value.FORMAT_JPEG, value.FORMAT_PNG}: continue try: coverartimage = TagCoverArtImage( @@ -337,7 +336,7 @@ class MP4File(File): for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if real_name and real_name in tags: - if tag not in ("totaltracks", "totaldiscs"): + if tag not in {"totaltracks", "totaldiscs"}: del tags[real_name] @classmethod @@ -364,9 +363,9 @@ class MP4File(File): return self.__r_freeform_tags_ci[name] elif name == "musicip_fingerprint": return "----:com.apple.iTunes:fingerprint" - elif name in ("tracknumber", "totaltracks"): + elif name in {"tracknumber", "totaltracks"}: return "trkn" - elif name in ("discnumber", "totaldiscs"): + elif name in {"discnumber", "totaldiscs"}: return "disk" elif self.supports_tag(name) and name not in self.__other_supported_tags: name = self.__casemap.get(name, name) diff --git a/picard/formats/mutagenext/compatid3.py b/picard/formats/mutagenext/compatid3.py index 4b29e8e4a..1d1b4c269 100644 --- a/picard/formats/mutagenext/compatid3.py +++ b/picard/formats/mutagenext/compatid3.py @@ -73,7 +73,7 @@ def update_to_v23(tags): # leave TSOP, TSOA and TSOT even though they are officially defined # only in ID3v2.4, because most applications use them also in ID3v2.3 frames = [] - for key in ["TSOP", "TSOA", "TSOT", "TSST"]: + for key in {"TSOP", "TSOA", "TSOT", "TSST"}: frames.extend(tags.getall(key)) ID3.update_to_v23(tags) for frame in frames: diff --git a/picard/formats/vorbis.py b/picard/formats/vorbis.py index cf61478d8..158279968 100644 --- a/picard/formats/vorbis.py +++ b/picard/formats/vorbis.py @@ -323,7 +323,7 @@ class VCommentFile(File): for tag in metadata.deleted_tags: real_name = self._get_tag_name(tag) if is_valid_key(real_name) and real_name in tags: - if real_name in ('performer', 'comment'): + if real_name in {'performer', 'comment'}: parts = tag.split(':', 1) if len(parts) == 2: tag_type_regex = re.compile(r"\(%s\)$" % re.escape(parts[1])) @@ -335,7 +335,7 @@ class VCommentFile(File): existing_tags.remove(item) tags[real_name] = existing_tags else: - if tag in ('totaldiscs', 'totaltracks') and tag in tags: + if tag in {'totaldiscs', 'totaltracks'} and tag in tags: # both tag and real_name are to be deleted in this case del tags[tag] del tags[real_name] diff --git a/picard/mbjson.py b/picard/mbjson.py index 3399ba695..7658e6327 100644 --- a/picard/mbjson.py +++ b/picard/mbjson.py @@ -155,7 +155,7 @@ def _relations_to_metadata(relations, m): attribs = [] if 'attributes' in relation: attribs = [a for a in relation['attributes']] - if reltype in ('vocal', 'instrument', 'performer'): + if reltype in {'vocal', 'instrument', 'performer'}: if use_instrument_credits: attr_credits = relation.get('attribute-credits', {}) else: @@ -424,9 +424,9 @@ def recording_to_metadata(node, m, track=None): add_genres_from_node(artist, artist_obj) elif key == 'relations': _relations_to_metadata(value, m) - elif key in ('genres', 'tags') and track: + elif track and key in {'genres', 'tags'}: add_genres(value, track) - elif key in ('user-genres', 'user-tags') and track: + elif track and key in {'user-genres', 'user-tags'}: add_user_genres(value, track) elif key == 'isrcs': add_isrcs_to_metadata(value, m) diff --git a/picard/metadata.py b/picard/metadata.py index 14fe4523c..7a2d2fcc7 100644 --- a/picard/metadata.py +++ b/picard/metadata.py @@ -214,7 +214,7 @@ class Metadata(MutableMapping): a = self[name] b = other[name] if a and b: - if name in ('tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'): + if name in {'tracknumber', 'totaltracks', 'discnumber', 'totaldiscs'}: try: ia = int(a) ib = int(b) @@ -568,7 +568,7 @@ class MultiMetadataProxy: return attribute def __setattr__(self, name, value): - if name in ('metadata', 'combined_metadata'): + if name in {'metadata', 'combined_metadata'}: super().__setattr__(name, value) else: self.metadata.__setattr__(name, value) diff --git a/picard/script/functions.py b/picard/script/functions.py index 3e93b7dbe..609bc23e2 100644 --- a/picard/script/functions.py +++ b/picard/script/functions.py @@ -404,7 +404,7 @@ For example `$unset(performer:*)` would unset all performer tags.""" def func_unset(parser, name): name = normalize_tagname(name) # Allow wild-card unset for certain keys - if name in ('performer:*', 'comment:*', 'lyrics:*'): + if name in {'performer:*', 'comment:*', 'lyrics:*'}: name = name[:-1] for key in list(parser.context.keys()): if key.startswith(name): diff --git a/picard/track.py b/picard/track.py index a1e21ffcd..4bed97bde 100644 --- a/picard/track.py +++ b/picard/track.py @@ -92,7 +92,7 @@ class TagGenreFilter: self.match_regexes = defaultdict(list) for lineno, line in enumerate(filters.splitlines()): line = line.strip() - if line and line[0] in ('+', '-'): + if line and line[0] in {'+', '-'}: _list = line[0] remain = line[1:].strip() if not remain: diff --git a/picard/ui/coverartbox.py b/picard/ui/coverartbox.py index f3a174664..767cb1e21 100644 --- a/picard/ui/coverartbox.py +++ b/picard/ui/coverartbox.py @@ -114,7 +114,7 @@ class CoverArtThumbnail(ActiveLabel): if not accepted: for url in mime_data.urls(): - if url.scheme() in ('https', 'http', 'file'): + if url.scheme() in {'https', 'http', 'file'}: accepted = True log.debug("Dropped %s url (with %d bytes of data)", url.toString(), len(dropped_data or '')) @@ -398,7 +398,7 @@ class CoverArtBox(QtWidgets.QGroupBox): if fallback_data: self.load_remote_image(url, fallback_data) - if url.scheme() in ('http', 'https'): + if url.scheme() in {'http', 'https'}: path = url.path() if url.hasQuery(): query = QtCore.QUrlQuery(url.query()) @@ -434,7 +434,7 @@ class CoverArtBox(QtWidgets.QGroupBox): url_query = QtCore.QUrlQuery(url.query()) log.debug('Fetched remote image with MIME-Type %s from %s', mime, url.toString()) # If mime indicates only binary data we can try to guess the real mime type - if (mime in ('application/octet-stream', 'binary/data') or mime.startswith('image/') + if (mime in {'application/octet-stream', 'binary/data'} or mime.startswith('image/') or imageinfo.supports_mime_type(mime)): try: self._try_load_remote_image(url, data) diff --git a/picard/ui/edittagdialog.py b/picard/ui/edittagdialog.py index 89f03c3bb..83fa7714c 100644 --- a/picard/ui/edittagdialog.py +++ b/picard/ui/edittagdialog.py @@ -57,14 +57,14 @@ class TagEditorDelegate(QtWidgets.QItemDelegate): if not index.isValid(): return None tag = self.get_tag_name(index) - if tag.partition(':')[0] in ('comment', 'lyrics'): + if tag.partition(':')[0] in {'comment', 'lyrics'}: editor = QtWidgets.QPlainTextEdit(parent) editor.setFrameStyle(editor.style().styleHint(QtWidgets.QStyle.SH_ItemView_DrawDelegateFrame, None, editor)) editor.setMinimumSize(QtCore.QSize(0, 80)) else: editor = super().createEditor(parent, option, index) completer = None - if tag in ('date', 'originaldate'): + if tag in {'date', 'originaldate'}: editor.setPlaceholderText(_('YYYY-MM-DD')) elif tag == 'originalyear': editor.setPlaceholderText(_('YYYY')) @@ -120,7 +120,7 @@ class EditTagDialog(PicardDialog): self.value_selection_changed() def keyPressEvent(self, event): - if event.modifiers() == QtCore.Qt.NoModifier and event.key() in (QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return): + if event.modifiers() == QtCore.Qt.NoModifier and event.key() in {QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return}: self.add_or_edit_value() event.accept() elif event.matches(QtGui.QKeySequence.Delete): diff --git a/picard/ui/itemviews.py b/picard/ui/itemviews.py index 33d7128ef..2bddbfa7c 100644 --- a/picard/ui/itemviews.py +++ b/picard/ui/itemviews.py @@ -746,7 +746,7 @@ class BaseTreeView(QtWidgets.QTreeWidget): files.append(file) else: new_paths.append(filename) - elif url.scheme() in ("http", "https"): + elif url.scheme() in {"http", "https"}: file_lookup = tagger.get_file_lookup() file_lookup.mbid_lookup(url.path(), browser_fallback=False) if files: @@ -809,7 +809,7 @@ class BaseTreeView(QtWidgets.QTreeWidget): cluster_item.add_files(cluster.files) def moveCursor(self, action, modifiers): - if action in (QtWidgets.QAbstractItemView.MoveUp, QtWidgets.QAbstractItemView.MoveDown): + if action in {QtWidgets.QAbstractItemView.MoveUp, QtWidgets.QAbstractItemView.MoveDown}: item = self.currentItem() if item and not item.isSelected(): self.setCurrentItem(item) diff --git a/picard/ui/metadatabox.py b/picard/ui/metadatabox.py index eff966e4d..fea5fba4d 100644 --- a/picard/ui/metadatabox.py +++ b/picard/ui/metadatabox.py @@ -285,9 +285,9 @@ class MetadataBox(QtWidgets.QTableWidget): return False item = self.itemFromIndex(index) if item.flags() & QtCore.Qt.ItemIsEditable and \ - trigger in (QtWidgets.QAbstractItemView.DoubleClicked, + trigger in {QtWidgets.QAbstractItemView.DoubleClicked, QtWidgets.QAbstractItemView.EditKeyPressed, - QtWidgets.QAbstractItemView.AnyKeyPressed): + QtWidgets.QAbstractItemView.AnyKeyPressed}: tag = self.tag_diff.tag_names[item.row()] values = self.tag_diff.new[tag] if len(values) > 1: diff --git a/picard/ui/widgets/editablelistview.py b/picard/ui/widgets/editablelistview.py index b6e2f4142..d3056b926 100644 --- a/picard/ui/widgets/editablelistview.py +++ b/picard/ui/widgets/editablelistview.py @@ -212,7 +212,7 @@ class EditableListModel(QtCore.QAbstractListModel): return len(self._items) def data(self, index, role=QtCore.Qt.DisplayRole): - if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if not index.isValid() or role not in {QtCore.Qt.DisplayRole, QtCore.Qt.EditRole}: return None field = 1 if role == QtCore.Qt.DisplayRole else 0 try: @@ -221,7 +221,7 @@ class EditableListModel(QtCore.QAbstractListModel): return None def setData(self, index, value, role=QtCore.Qt.EditRole): - if not index.isValid() or role not in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if not index.isValid() or role not in {QtCore.Qt.DisplayRole, QtCore.Qt.EditRole}: return False i = index.row() try: diff --git a/picard/ui/widgets/scripttextedit.py b/picard/ui/widgets/scripttextedit.py index 6ebe73726..7b2a9bb5e 100644 --- a/picard/ui/widgets/scripttextedit.py +++ b/picard/ui/widgets/scripttextedit.py @@ -455,7 +455,7 @@ class ScriptTextEdit(QTextEdit): tc.select(QTextCursor.WordUnderCursor) selected_text = tc.selectedText() # Check for start of function or end of variable - if current_position > 0 and selected_text and selected_text[0] in ('(', '%'): + if current_position > 0 and selected_text and selected_text[0] in {'(', '%'}: current_position -= 1 tc.setPosition(current_position) tc.select(QTextCursor.WordUnderCursor) @@ -484,7 +484,7 @@ class ScriptTextEdit(QTextEdit): def keyPressEvent(self, event): if self.completer.popup().isVisible(): - if event.key() in (Qt.Key_Tab, Qt.Key_Return, Qt.Key_Enter): + if event.key() in {Qt.Key_Tab, Qt.Key_Return, Qt.Key_Enter}: self.completer.activated.emit(self.completer.get_selected()) return @@ -497,14 +497,14 @@ class ScriptTextEdit(QTextEdit): modifier = QtCore.Qt.MetaModifier if IS_MACOS else QtCore.Qt.ControlModifier force_completion_popup = event.key() == QtCore.Qt.Key_Space and event.modifiers() & modifier if not (force_completion_popup - or event.key() in (Qt.Key_Backspace, Qt.Key_Delete) + or event.key() in {Qt.Key_Backspace, Qt.Key_Delete} or self.autocomplete_trigger_chars.match(event.text())): self.popup_hide() return tc = self.cursor_select_word(full_word=False) selected_text = tc.selectedText() - if force_completion_popup or (selected_text and selected_text[0] in ('$', '%')): + if force_completion_popup or (selected_text and selected_text[0] in {'$', '%'}): self.completer.setCompletionPrefix(selected_text) popup = self.completer.popup() popup.setCurrentIndex(self.completer.currentIndex()) diff --git a/picard/util/__init__.py b/picard/util/__init__.py index 5af57d9d1..7470cdced 100644 --- a/picard/util/__init__.py +++ b/picard/util/__init__.py @@ -839,7 +839,7 @@ def wildcards_to_regex_pattern(pattern): for c in pattern: if group is not None: if escape: - if c in ('\\', '[', ']'): + if c in {'\\', '[', ']'}: c = '\\' + c else: group.append('\\\\') @@ -855,7 +855,7 @@ def wildcards_to_regex_pattern(pattern): group.append(c) continue elif escape: - if c in ('*', '?', '\\', '[', ']'): + if c in {'*', '?', '\\', '[', ']'}: part = '\\' + c else: part = re.escape('\\' + c) diff --git a/picard/util/icontheme.py b/picard/util/icontheme.py index 7a4713341..5f3f13c96 100644 --- a/picard/util/icontheme.py +++ b/picard/util/icontheme.py @@ -42,7 +42,7 @@ else: _current_theme = None if 'XDG_CURRENT_DESKTOP' in os.environ: desktop = os.environ['XDG_CURRENT_DESKTOP'].lower() - if desktop in ('gnome', 'unity'): + if desktop in {'gnome', 'unity'}: _current_theme = (os.popen('gsettings get org.gnome.desktop.interface icon-theme').read().strip()[1:-1] or None) elif os.environ.get('KDE_FULL_SESSION'): diff --git a/picard/util/imageinfo.py b/picard/util/imageinfo.py index e98d0fd77..57fe2ad74 100644 --- a/picard/util/imageinfo.py +++ b/picard/util/imageinfo.py @@ -128,7 +128,7 @@ class IdentifyGIF(IdentifyImageType): def match(self): # http://en.wikipedia.org/wiki/Graphics_Interchange_Format - return self.data[:6] in (b'GIF87a', b'GIF89a') + return self.data[:6] in {b'GIF87a', b'GIF89a'} def _read(self): self.w, self.h = struct.unpack('