diff --git a/scripts/weboob b/scripts/weboob index 24b70c46bb1c91692bc229bd69a262d6ee5fcbe4..9bd955ef888f42b87393473a7b1212fc29568727 100755 --- a/scripts/weboob +++ b/scripts/weboob @@ -107,19 +107,17 @@ class Weboob(ConsoleApplication): def choose_capability(self, capApplicationDict): cap = None - while cap not in capApplicationDict.keys(): - for _cap in capApplicationDict.keys(): - print(' %s%2d)%s %s' % (self.BOLD, - capApplicationDict.keys().index(_cap) + 1, - self.NC, - _cap)) + caps = list(capApplicationDict.keys()) + while cap not in caps: + for n, _cap in enumerate(caps): + print(' %s%2d)%s %s' % (self.BOLD, n + 1, self.NC, _cap)) r = self.ask(' Select a capability', regexp='(\d+|)', default='') if not r.isdigit(): continue r = int(r) - if r <= 0 or r > len(capApplicationDict.keys()): + if r <= 0 or r > len(caps): continue - cap = capApplicationDict.keys()[r - 1] + cap = caps[r - 1] return cap def init_CapApplicationDict(self): diff --git a/weboob/applications/boobathon/boobathon.py b/weboob/applications/boobathon/boobathon.py index c067972ea3f52e800106296554a0dccca3adf05d..ab0dc1dcaf21d605f11bd26b5a2349d365cd9d47 100644 --- a/weboob/applications/boobathon/boobathon.py +++ b/weboob/applications/boobathon/boobathon.py @@ -296,7 +296,7 @@ def main(self, argv): print('Please give the name of the boobathon', file=self.stderr) return 1 - self.event = Event(argv[1], choice(self.weboob.backend_instances.values())) + self.event = Event(argv[1], choice(list(self.weboob.backend_instances.values()))) if self.event.description is None: if not self.ask("This event doesn't seem to exist. Do you want to create it?", default=True): return 1 diff --git a/weboob/applications/boobtracker/boobtracker.py b/weboob/applications/boobtracker/boobtracker.py index c23da01b266463f2b0ee0e72a7407f5705aaec74..2ce190594e9570f3d2369e5b834a6a1ac4b76e10 100644 --- a/weboob/applications/boobtracker/boobtracker.py +++ b/weboob/applications/boobtracker/boobtracker.py @@ -466,7 +466,7 @@ def complete_edit(self, text, line, *ignored): if len(args) == 2: return self._complete_object() if len(args) == 3: - return dict(self.ISSUE_FIELDS).keys() + return list(dict(self.ISSUE_FIELDS).keys()) def do_edit(self, line): """ diff --git a/weboob/applications/comparoob/comparoob.py b/weboob/applications/comparoob/comparoob.py index 645bb7c3c04cbf5f8f0f7faf579f41d1ca8141b4..6e22268f28c8baf8c5b5379c4dd5c4b01dd78e15 100644 --- a/weboob/applications/comparoob/comparoob.py +++ b/weboob/applications/comparoob/comparoob.py @@ -108,12 +108,12 @@ def do_prices(self, pattern): products[product.name] = [product] products_type = None - products_names = products.keys() + products_names = list(products.keys()) if len(products_names) == 0: print('Error: no product found with this pattern', file=self.stderr) return 1 elif len(products_names) == 1: - products_type = products.keys()[0] + products_type = products_names[0] else: print('What product do you want to compare?') for i, p in enumerate(products_names): diff --git a/weboob/applications/parceloob/parceloob.py b/weboob/applications/parceloob/parceloob.py index 1dda5851edf150a821cbe36f6d8f7ebbb52fcba4..fd853c9fd67ccd80e445c3d263c32990bc4a7c3f 100644 --- a/weboob/applications/parceloob/parceloob.py +++ b/weboob/applications/parceloob/parceloob.py @@ -161,7 +161,7 @@ def do_status(self, line): Display status for all of the tracked parcels. """ - backends = map(get_backend_name, self.enabled_backends) + backends = list(map(get_backend_name, self.enabled_backends)) self.start_format() # XXX cleaning of cached objects may be by start_format()? self.objects = [] diff --git a/weboob/applications/pastoob/pastoob.py b/weboob/applications/pastoob/pastoob.py index bdd9d91c5e79d282b4c8c864c81dac8941e22b57..29a303533249cd221f016c7013666100b26498f5 100644 --- a/weboob/applications/pastoob/pastoob.py +++ b/weboob/applications/pastoob/pastoob.py @@ -163,7 +163,7 @@ def _post(self, filename, binary): backends.setdefault(score, []).append(backend) # select a random backend from the best scores if len(backends): - backend = choice(backends[max(backends.keys())]) + backend = choice(backends[max(list(backends.keys()))]) else: print('No suitable backend found.', file=self.stderr) return 1 diff --git a/weboob/applications/qhavedate/contacts.py b/weboob/applications/qhavedate/contacts.py index 0a3c73bbdca3faaa7c0277a0846f893f011876a6..023bb22dd167b081bc656f14c7b04588032f1860 100644 --- a/weboob/applications/qhavedate/contacts.py +++ b/weboob/applications/qhavedate/contacts.py @@ -322,7 +322,7 @@ def display_photo(self): self.ui.photoUrlLabel.setText('') return - photo = self.contact.photos.values()[self.displayed_photo_idx] + photo = list(self.contact.photos.values())[self.displayed_photo_idx] if photo.data: data = photo.data if photo.id in self.process_photo: @@ -534,7 +534,7 @@ def addContact(self, contact): self.photo_processes[contact.id] = process elif len(contact.photos) > 0: if not self.setPhoto(contact, item): - photo = contact.photos.values()[0] + photo = list(contact.photos.values())[0] process = QtDo(self.weboob, lambda p: self.setPhoto(contact, item)) process.do('fillobj', photo, ['thumbnail_data'], backends=contact.backend) self.photo_processes[contact.id] = process diff --git a/weboob/applications/qhavedate/events.py b/weboob/applications/qhavedate/events.py index 563bf3be54e7de11383f4b7782d8761be4067217..602c298581a6fb20db2c52f14add39689fca387e 100644 --- a/weboob/applications/qhavedate/events.py +++ b/weboob/applications/qhavedate/events.py @@ -153,7 +153,7 @@ def gotEvent(self, event): self.photo_processes[contact.id] = process elif len(contact.photos) > 0: if not self.setPhoto(contact, item): - photo = contact.photos.values()[0] + photo = list(contact.photos.values())[0] process = QtDo(self.weboob, lambda p: self.setPhoto(contact, item)) process.do('fillobj', photo, ['thumbnail_data'], backends=contact.backend) self.photo_processes[contact.id] = process diff --git a/weboob/browser/browsers.py b/weboob/browser/browsers.py index 47384dd9e851b9c51af1f3b12cd18c69ead2d04d..258886f8f29db0c4251ebc55b2adc4357080f8e2 100644 --- a/weboob/browser/browsers.py +++ b/weboob/browser/browsers.py @@ -602,7 +602,7 @@ class _PagesBrowserMeta(type): Private meta-class used to keep order of URLs instances of PagesBrowser. """ def __new__(mcs, name, bases, attrs): - urls = [(url_name, attrs.pop(url_name)) for url_name, obj in attrs.items() if isinstance(obj, URL)] + urls = [(url_name, attrs.pop(url_name)) for url_name, obj in list(attrs.items()) if isinstance(obj, URL)] urls.sort(key=lambda x: x[1]._creation_counter) new_class = super(_PagesBrowserMeta, mcs).__new__(mcs, name, bases, attrs) diff --git a/weboob/browser/filters/standard.py b/weboob/browser/filters/standard.py index 320c8d1b4efb1962c0d11a22f1a9841ab33ffabb..ad639fcc78638d330ce871231731859605c11ad2 100644 --- a/weboob/browser/filters/standard.py +++ b/weboob/browser/filters/standard.py @@ -649,7 +649,7 @@ def filter(self, txt): return self.default_or_raise(RegexpError(msg)) if isinstance(m, Iterator): - return map(self.expand, m) + return list(map(self.expand, m)) return self.expand(m) @@ -789,7 +789,7 @@ class BrowserURL(MultiFilter): def __init__(self, url_name, **kwargs): super(BrowserURL, self).__init__(*kwargs.values()) self.url_name = url_name - self.keys = kwargs.keys() + self.keys = list(kwargs.keys()) def __call__(self, item): values = super(BrowserURL, self).__call__(item) diff --git a/weboob/browser/pages.py b/weboob/browser/pages.py index 2b8557072c3b638ed9cfec19e01e306113a0624c..7c3b016685b2f2312ac691c48883607d48c20600 100644 --- a/weboob/browser/pages.py +++ b/weboob/browser/pages.py @@ -391,7 +391,7 @@ def parse(self, data, encoding=None): for i, row in enumerate(reader): if self.HEADER and i+1 < self.HEADER: continue - row = map(unicode.strip, self.decode_row(row, encoding)) + row = [c.strip() for c in self.decode_row(row, encoding)] if header is None and self.HEADER: header = row else: @@ -424,7 +424,7 @@ def data(self): def get(self, path): node = self.doc - for name in filter(None, path.strip('.').split('.')): + for name in [_f for _f in path.strip('.').split('.') if _f]: node = node.get(name) if node is None: break @@ -473,7 +473,7 @@ def parse(self, data): continue row = sh.row_values(i) if header is None and self.HEADER: - header = map(lambda s: s.replace('/', ''), row) + header = [s.replace('/', '') for s in row] else: rows.append(row) if header: diff --git a/weboob/browser/url.py b/weboob/browser/url.py index 9745bf1d61adbcbeb254458e57bb1edffe428771..6d61cd563ad36c773dc86ad560873b313b0df7d6 100644 --- a/weboob/browser/url.py +++ b/weboob/browser/url.py @@ -136,7 +136,7 @@ def build(self, **kwargs): url = pattern # only use full-name substitutions, to allow % in URLs args = kwargs.copy() - for key in args.keys(): # need to use keys() because of pop() + for key in list(args.keys()): # need to use keys() because of pop() search = '%%(%s)s' % key if search in pattern: url = url.replace(search, to_unicode(args.pop(key))) diff --git a/weboob/capabilities/base.py b/weboob/capabilities/base.py index 2d4d5c6932aae00a6fd4375484cb459d77d44a7f..d68631bc3f3865ab50a369446fb685a5984a09d7 100644 --- a/weboob/capabilities/base.py +++ b/weboob/capabilities/base.py @@ -34,11 +34,12 @@ def enum(**enums): - _values = enums.values() - _keys = enums.keys() - _items = enums.items() + _values = list(enums.values()) + _keys = list(enums.keys()) + _items = list(enums.items()) _types = list((type(value) for value in enums.values())) - _index = dict((value if not isinstance(value, dict) else next(value.itervalues()), i) for i, value in enumerate(enums.values())) + _index = {(value if not isinstance(value, dict) else next(iter(value.values()))): i + for i, value in enumerate(enums.values())} enums['keys'] = _keys enums['values'] = _values @@ -295,7 +296,7 @@ def convert(self, value): class _BaseObjectMeta(type): def __new__(cls, name, bases, attrs): - fields = [(field_name, attrs.pop(field_name)) for field_name, obj in attrs.items() if isinstance(obj, Field)] + fields = [(field_name, attrs.pop(field_name)) for field_name, obj in list(attrs.items()) if isinstance(obj, Field)] fields.sort(key=lambda x: x[1]._creation_counter) new_class = super(_BaseObjectMeta, cls).__new__(cls, name, bases, attrs) diff --git a/weboob/capabilities/bill.py b/weboob/capabilities/bill.py index 1b7d962cd57ecdc5bd2ccfe3ae885364e052dc72..bcf64e984e5ab3385ec7868d07824da0df9fe1b6 100644 --- a/weboob/capabilities/bill.py +++ b/weboob/capabilities/bill.py @@ -177,7 +177,7 @@ def iter_bills(self, subscription): :rtype: iter[:class:`Bill`] """ documents = self.iter_documents(subscription) - return filter(lambda doc: doc.type == "bill", documents) + return [doc for doc in documents if doc.type == "bill"] def get_details(self, subscription): """ diff --git a/weboob/core/ouiboube.py b/weboob/core/ouiboube.py index f4fbcd38b232b7c708ac225caca18dfae81c463c..cffe8f630ec59d2c2d93190b5d8e537dba7c559c 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -159,7 +159,7 @@ def unload_backends(self, names=None): if isinstance(names, basestring): names = [names] elif names is None: - names = self.backend_instances.keys() + names = list(self.backend_instances.keys()) for name in names: backend = self.backend_instances.pop(name) @@ -243,7 +243,7 @@ def do(self, function, *args, **kwargs): :type caps: list[:class:`weboob.capabilities.base.Capability`] :rtype: A :class:`weboob.core.bcall.BackendsCall` object (iterable) """ - backends = self.backend_instances.values() + backends = list(self.backend_instances.values()) _backends = kwargs.pop('backends', None) if _backends is not None: if isinstance(_backends, Module): diff --git a/weboob/tools/application/formatters/iformatter.py b/weboob/tools/application/formatters/iformatter.py index 7e29dc4feb3084b640afcc75b03cf9043955a20e..23cd43ba87b23f123fede79237b5732e2cd61555 100644 --- a/weboob/tools/application/formatters/iformatter.py +++ b/weboob/tools/application/formatters/iformatter.py @@ -172,7 +172,7 @@ def format(self, obj, selected_fields=None, alias=None): if isinstance(obj, BaseObject): if selected_fields: # can be an empty list (nothing to do), or None (return all fields) obj = obj.copy() - for name, value in obj.iter_fields(): + for name, value in list(obj.iter_fields()): if name not in selected_fields: delattr(obj, name) diff --git a/weboob/tools/application/formatters/table.py b/weboob/tools/application/formatters/table.py index 33914a96cd1281c0d71bac079715b08bcd36f786..68d4a80a704218cf299ac4d6886213608dcc6451 100644 --- a/weboob/tools/application/formatters/table.py +++ b/weboob/tools/application/formatters/table.py @@ -96,8 +96,8 @@ def get_formatted_table(self): def format_dict(self, item): if self.keys is None: - self.keys = item.keys() - self.queue.append(item.values()) + self.keys = list(item.keys()) + self.queue.append(list(item.values())) def set_header(self, string): self.header = string diff --git a/weboob/tools/date.py b/weboob/tools/date.py index b6de2f738e43451818f2fbb58d82feac7dd643f9..3305977ce61bba236246a8384a88c153660d0534 100644 --- a/weboob/tools/date.py +++ b/weboob/tools/date.py @@ -345,7 +345,7 @@ def parse_date(string): year = 2000 + int(year) return date(int(year), int(matches.group(2)), int(matches.group(1))) - elif string.upper() in WEEK.keys(): + elif string.upper() in list(WEEK.keys()): return get_date_from_day(string) elif string.upper() == "TODAY": diff --git a/weboob/tools/json.py b/weboob/tools/json.py index 811c3ba5f07f1fb4e30b74b82ab7cc4b569e84a6..257d060c3a903b4cf7c86cb86468b6262150fe20 100644 --- a/weboob/tools/json.py +++ b/weboob/tools/json.py @@ -56,7 +56,7 @@ def mini_jsonpath(node, path): """ def iterkeys(i): - return range(len(i)) if type(i) is list else i + return range(len(i)) if isinstance(i, list) else i def cut(s): p = s.split('.', 1) if s else [None] diff --git a/weboob/tools/pdf.py b/weboob/tools/pdf.py index 1a9c6c3fa63442b9ee523d3b9f4c049538d9a384..57093c6c5238079d5ae27106c556ac487cae785f 100644 --- a/weboob/tools/pdf.py +++ b/weboob/tools/pdf.py @@ -240,7 +240,7 @@ def build_rows(lines): box = Rect(hline.x0, hline.y0, hline.x1, vline.y1) boxes.setdefault((vline.y0, vline.y1), []).append(box) - rows = boxes.values() + rows = list(boxes.values()) for row in rows: row.sort(key=lambda box: box.x0) rows.sort(key=lambda row: row[0].y0) diff --git a/weboob/tools/regex_helper.py b/weboob/tools/regex_helper.py index 5bb39c5e94a7cead421efa72924048c880e14fcc..e70e6d35d0e0e7ae9ba0a7882dd54229d12d59a0 100644 --- a/weboob/tools/regex_helper.py +++ b/weboob/tools/regex_helper.py @@ -111,7 +111,7 @@ def normalize(pattern): try: ch, escaped = next(pattern_iter) except StopIteration: - return zip([u''], [[]]) + return list(zip([u''], [[]])) try: while True: @@ -224,9 +224,9 @@ def normalize(pattern): pass except NotImplementedError: # A case of using the disjunctive form. No results for you! - return zip([u''], [[]]) + return list(zip([u''], [[]])) - return zip(*flatten_result(result)) + return list(zip(*flatten_result(result))) def next_char(input_iter):