From be118c3338c4154b612789fbdb07561e8d455665 Mon Sep 17 00:00:00 2001 From: Valentin Lorentz Date: Sat, 8 Aug 2015 22:20:14 +0200 Subject: [PATCH] Remove use of fix_dict fixer. --- plugins/Aka/plugin.py | 3 +- plugins/Alias/plugin.py | 2 +- plugins/Channel/plugin.py | 2 +- plugins/ChannelLogger/plugin.py | 4 +-- plugins/ChannelStats/plugin.py | 2 +- plugins/Config/plugin.py | 2 +- plugins/Ctcp/plugin.py | 2 +- plugins/Factoids/plugin.py | 4 +-- plugins/Filter/plugin.py | 9 +++-- plugins/GPG/test.py | 2 +- plugins/Google/plugin.py | 2 +- plugins/Karma/plugin.py | 6 ++-- plugins/Later/plugin.py | 4 +-- plugins/Math/local/convertcore.py | 2 +- plugins/Misc/plugin.py | 4 +-- plugins/MoobotFactoids/plugin.py | 2 +- plugins/Note/plugin.py | 2 +- plugins/Owner/plugin.py | 2 +- plugins/Plugin/plugin.py | 2 +- plugins/QuoteGrabs/plugin.py | 2 +- plugins/Scheduler/plugin.py | 4 +-- plugins/ShrinkUrl/test.py | 2 +- plugins/Todo/plugin.py | 2 +- plugins/User/plugin.py | 4 +-- plugins/__init__.py | 16 ++++----- setup.py | 1 - src/cdb.py | 18 +++++----- src/commands.py | 4 +-- src/dbi.py | 4 +-- src/drivers/__init__.py | 2 +- src/i18n.py | 2 +- src/ircdb.py | 24 ++++++------- src/irclib.py | 4 +-- src/ircutils.py | 2 +- src/log.py | 2 +- src/registry.py | 4 +-- src/test.py | 4 +-- src/utils/gen.py | 60 +++++++++++++++++-------------- src/utils/structures.py | 10 +++--- src/world.py | 2 +- test/test_utils.py | 6 ++-- 41 files changed, 121 insertions(+), 116 deletions(-) diff --git a/plugins/Aka/plugin.py b/plugins/Aka/plugin.py index c0cc48774..aa4335ad5 100644 --- a/plugins/Aka/plugin.py +++ b/plugins/Aka/plugin.py @@ -695,7 +695,8 @@ class Aka(callbacks.Plugin): if alias_plugin is None: irc.error(_('Alias plugin is not loaded.'), Raise=True) errors = {} - for (name, (command, locked, func)) in alias_plugin.aliases.items(): + for (name, (command, locked, func)) in \ + list(alias_plugin.aliases.items()): try: self._add_aka('global', name, command) except AkaError as e: diff --git a/plugins/Alias/plugin.py b/plugins/Alias/plugin.py index e2f8cbbdf..8ddc2b59b 100644 --- a/plugins/Alias/plugin.py +++ b/plugins/Alias/plugin.py @@ -241,7 +241,7 @@ class Alias(callbacks.Plugin): # XXX This should go. aliases should be a space separate list, etc. group = conf.supybot.plugins.Alias.aliases group2 = conf.supybot.plugins.Alias.escapedaliases - for (name, alias) in registry._cache.iteritems(): + for (name, alias) in registry._cache.items(): name = name.lower() if name.startswith('supybot.plugins.alias.aliases.'): name = name[len('supybot.plugins.alias.aliases.'):] diff --git a/plugins/Channel/plugin.py b/plugins/Channel/plugin.py index 746a4aa47..72ab2aa9f 100644 --- a/plugins/Channel/plugin.py +++ b/plugins/Channel/plugin.py @@ -549,7 +549,7 @@ class Channel(callbacks.Plugin): Returns the channels in which this bot is lobotomized. """ L = [] - for (channel, c) in ircdb.channels.iteritems(): + for (channel, c) in ircdb.channels.items(): if c.lobotomized: chancap = ircdb.makeChannelCapability(channel, 'op') if ircdb.checkCapability(msg.prefix, 'admin') or \ diff --git a/plugins/ChannelLogger/plugin.py b/plugins/ChannelLogger/plugin.py index b3fe10aa8..897e5d68a 100644 --- a/plugins/ChannelLogger/plugin.py +++ b/plugins/ChannelLogger/plugin.py @@ -93,8 +93,8 @@ class ChannelLogger(callbacks.Plugin): self.lastStates.clear() def _logs(self): - for logs in self.logs.itervalues(): - for log in logs.itervalues(): + for logs in self.logs.values(): + for log in logs.values(): yield log def flush(self): diff --git a/plugins/ChannelStats/plugin.py b/plugins/ChannelStats/plugin.py index 2dee17b4d..4108b70fe 100644 --- a/plugins/ChannelStats/plugin.py +++ b/plugins/ChannelStats/plugin.py @@ -222,7 +222,7 @@ class ChannelStats(callbacks.Plugin): id = ircdb.users.getUserId(msg.prefix) except KeyError: id = None - for (channel, c) in self.laststate.channels.iteritems(): + for (channel, c) in self.laststate.channels.items(): if msg.nick in c.users: if (channel, 'channelStats') not in self.db: self.db[channel, 'channelStats'] = ChannelStat() diff --git a/plugins/Config/plugin.py b/plugins/Config/plugin.py index 7c20a7e73..060417f98 100644 --- a/plugins/Config/plugin.py +++ b/plugins/Config/plugin.py @@ -121,7 +121,7 @@ class Config(callbacks.Plugin): def _list(self, group): L = [] - for (vname, v) in group._children.iteritems(): + for (vname, v) in group._children.items(): if hasattr(group, 'channelValue') and group.channelValue and \ ircutils.isChannel(vname) and not v._children: continue diff --git a/plugins/Ctcp/plugin.py b/plugins/Ctcp/plugin.py index 57c06db80..8db2f0795 100644 --- a/plugins/Ctcp/plugin.py +++ b/plugins/Ctcp/plugin.py @@ -143,7 +143,7 @@ class Ctcp(callbacks.PluginRegexp): def doReply(): if self.versions: L = [] - for (reply, nickslist) in self.versions.iteritems(): + for (reply, nickslist) in self.versions.items(): if nicks: L.append(format('%L responded with %q', nickslist, reply)) else: diff --git a/plugins/Factoids/plugin.py b/plugins/Factoids/plugin.py index b9400586f..f01c3b95d 100644 --- a/plugins/Factoids/plugin.py +++ b/plugins/Factoids/plugin.py @@ -358,9 +358,9 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): dl_metrics = [dameraulevenshtein(key, sourcekey) for sourcekey in flkeys] dict_metrics = dict(list(zip(flkeys, dl_metrics))) if min(dl_metrics) <= 2: - return [key for key,item in dict_metrics.iteritems() if item <= 2] + return [key for key,item in dict_metrics.items() if item <= 2] if min(dl_metrics) <= 3: - return [key for key,item in dict_metrics.iteritems() if item <= 3] + return [key for key,item in dict_metrics.items() if item <= 3] return [] diff --git a/plugins/Filter/plugin.py b/plugins/Filter/plugin.py index aeaad0af6..4cdd0fa27 100644 --- a/plugins/Filter/plugin.py +++ b/plugins/Filter/plugin.py @@ -147,7 +147,6 @@ class Filter(callbacks.Plugin): """ L = [] if sys.version_info[0] >= 3: - print(repr(text)) if isinstance(text, str): bytes_ = text.encode() else: @@ -509,7 +508,7 @@ class Filter(callbacks.Plugin): r'\blike\b': 'liek', r'[^e]ing\b': 'eing', } - for (r, s) in alwaysInsertions.iteritems(): + for (r, s) in alwaysInsertions.items(): text = re.sub(r, s, text) randomInsertions = { r'i': 'ui', @@ -527,7 +526,7 @@ class Filter(callbacks.Plugin): r'\btheir\b': 'there', r'[^e]y': 'ey', } - for (r, s) in randomInsertions.iteritems(): + for (r, s) in randomInsertions.items(): text = re.sub(r, randomlyReplace(s), text) text = re.sub(r'(\w)\'(\w)', quoteOrNothing, text) text = re.sub(r'\.(\s+|$)', randomExclaims, text) @@ -551,7 +550,7 @@ class Filter(callbacks.Plugin): 'v': _('vee'), 'w': _('double-you'), 'x': _('ecks'), 'y': _('why'), 'z': _('zee') } - for (k, v) in _spellLetters.items(): + for (k, v) in list(_spellLetters.items()): _spellLetters[k.upper()] = v _spellPunctuation = { '!': _('exclamation point'), @@ -607,7 +606,7 @@ class Filter(callbacks.Plugin): d.update(self._spellPunctuation) # A bug in unicode on OSX prevents me from testing this. ## dd = {} -## for (c, v) in d.iteritems(): +## for (c, v) in d.items(): ## dd[ord(c)] = unicode(v + ' ') ## irc.reply(unicode(text).translate(dd)) out = StringIO() diff --git a/plugins/GPG/test.py b/plugins/GPG/test.py index f883e25d3..8d90a0d06 100644 --- a/plugins/GPG/test.py +++ b/plugins/GPG/test.py @@ -100,7 +100,7 @@ class GPGTestCase(PluginTestCase): def testGpgAuth(self): self.assertNotError('register spam egg') gpg.keyring.import_keys(PRIVATE_KEY).__dict__ - (id, user) = ircdb.users.items()[0] + (id, user) = list(ircdb.users.items())[0] user.gpgkeys.append(FINGERPRINT) msg = self.getMsg('gpg signing gettoken').args[-1] match = re.search('is: ({.*}).', msg) diff --git a/plugins/Google/plugin.py b/plugins/Google/plugin.py index 1bdb68536..d77242313 100644 --- a/plugins/Google/plugin.py +++ b/plugins/Google/plugin.py @@ -99,7 +99,7 @@ class Google(callbacks.PluginRegexp): headers = dict(utils.web.defaultHeaders) headers['Referer'] = ref opts = {'q': query, 'v': '1.0'} - for (k, v) in options.iteritems(): + for (k, v) in options.items(): if k == 'smallsearch': if v: opts['rsz'] = 'small' diff --git a/plugins/Karma/plugin.py b/plugins/Karma/plugin.py index c29bedabb..7dcf611f9 100644 --- a/plugins/Karma/plugin.py +++ b/plugins/Karma/plugin.py @@ -50,7 +50,7 @@ class SqliteKarmaDB(object): self.filename = filename def close(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.close() def _getDb(self, channel): @@ -100,11 +100,11 @@ class SqliteKarmaDB(object): criteria = ' OR '.join(['normalized=?'] * len(normalizedThings)) sql = """SELECT name, added-subtracted FROM karma WHERE %s ORDER BY added-subtracted DESC""" % criteria - cursor.execute(sql, normalizedThings.keys()) + cursor.execute(sql, list(normalizedThings.keys())) L = [(name, int(karma)) for (name, karma) in cursor.fetchall()] for (name, _) in L: del normalizedThings[name.lower()] - neutrals = normalizedThings.values() + neutrals = list(normalizedThings.values()) neutrals.sort() return (L, neutrals) diff --git a/plugins/Later/plugin.py b/plugins/Later/plugin.py index 71600d84b..375765042 100644 --- a/plugins/Later/plugin.py +++ b/plugins/Later/plugin.py @@ -61,7 +61,7 @@ class Later(callbacks.Plugin): def _flushNotes(self): fd = utils.file.AtomicFile(self.filename) writer = csv.writer(fd) - for (nick, notes) in self._notes.iteritems(): + for (nick, notes) in self._notes.items(): for (time, whence, text) in notes: writer.writerow([nick, time, whence, text]) fd.close() @@ -125,7 +125,7 @@ class Later(callbacks.Plugin): expiry = self.registryValue('messageExpiry') curtime = time.time() nickremovals=[] - for (nick, notes) in self._notes.iteritems(): + for (nick, notes) in self._notes.items(): removals = [] for (notetime, whence, text) in notes: td = datetime.timedelta(seconds=(curtime - notetime)) diff --git a/plugins/Math/local/convertcore.py b/plugins/Math/local/convertcore.py index f64420127..81d759acb 100644 --- a/plugins/Math/local/convertcore.py +++ b/plugins/Math/local/convertcore.py @@ -1083,7 +1083,7 @@ class UnitData(dict): for unit in units: self[unit.name.replace(' ', '')] = unit typeUnits[unit.typeName].append(unit.name) - self.sortedKeys = self.keys() + self.sortedKeys = list(self.keys()) self.sortedKeys.sort() if len(self.sortedKeys) < len(units): diff --git a/plugins/Misc/plugin.py b/plugins/Misc/plugin.py index bd228da2d..b36cf408a 100644 --- a/plugins/Misc/plugin.py +++ b/plugins/Misc/plugin.py @@ -270,7 +270,7 @@ class Misc(callbacks.Plugin): for command in cb.listCommands(): if s in command: commands.setdefault(command, []).append(cb.name()) - for (key, names) in commands.iteritems(): + for (key, names) in commands.items(): for name in names: L.append('%s %s' % (name, key)) if L: @@ -473,7 +473,7 @@ class Misc(callbacks.Plugin): # Drop the first message only if our current channel is the same as # the channel we've been instructed to look at. next(iterable) - predicates = list(utils.iter.flatten(predicates.itervalues())) + predicates = list(utils.iter.flatten(predicates.values())) # Make sure the user can't get messages from channels they aren't in def userInChannel(m): return m.args[0] in irc.state.channels \ diff --git a/plugins/MoobotFactoids/plugin.py b/plugins/MoobotFactoids/plugin.py index d10305dad..b38359f36 100755 --- a/plugins/MoobotFactoids/plugin.py +++ b/plugins/MoobotFactoids/plugin.py @@ -94,7 +94,7 @@ class SqliteMoobotDB(object): self.dbs = ircutils.IrcDict() def close(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.close() self.dbs.clear() diff --git a/plugins/Note/plugin.py b/plugins/Note/plugin.py index ccf789b7b..ad41f75e8 100644 --- a/plugins/Note/plugin.py +++ b/plugins/Note/plugin.py @@ -397,7 +397,7 @@ class Note(callbacks.Plugin): else: temp[note[1]] = [note[0]] notes = [] - for (k,v) in temp.iteritems(): + for (k,v) in temp.items(): if '(private)' in k: k = k.replace('(private)', format('%b private', len(v))) notes.append(format('%L %s', v, k)) diff --git a/plugins/Owner/plugin.py b/plugins/Owner/plugin.py index 20fdafce1..20cc205ee 100644 --- a/plugins/Owner/plugin.py +++ b/plugins/Owner/plugin.py @@ -96,7 +96,7 @@ class Owner(callbacks.Plugin): # This needs to be done before we connect to any networks so that the # children of supybot.plugins (the actual plugins) exist and can be # loaded. - for (name, s) in registry._cache.iteritems(): + for (name, s) in registry._cache.items(): if 'alwaysLoadDefault' in name or 'alwaysLoadImportant' in name: continue if name.startswith('supybot.plugins'): diff --git a/plugins/Plugin/plugin.py b/plugins/Plugin/plugin.py index 1483376ff..a07db1fac 100644 --- a/plugins/Plugin/plugin.py +++ b/plugins/Plugin/plugin.py @@ -162,7 +162,7 @@ class Plugin(callbacks.Plugin): Sort the list of 'long names' based on the number of contributions associated with each. """ - L = module.__contributors__.items() + L = list(module.__contributors__.items()) def negativeSecondElement(x): return -len(x[1]) utils.sortBy(negativeSecondElement, L) diff --git a/plugins/QuoteGrabs/plugin.py b/plugins/QuoteGrabs/plugin.py index 12439a2de..4de6da4dd 100644 --- a/plugins/QuoteGrabs/plugin.py +++ b/plugins/QuoteGrabs/plugin.py @@ -73,7 +73,7 @@ class SqliteQuoteGrabsDB(object): self.filename = filename def close(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.close() def _getDb(self, channel): diff --git a/plugins/Scheduler/plugin.py b/plugins/Scheduler/plugin.py index 3b735d6d5..9a84e96b3 100644 --- a/plugins/Scheduler/plugin.py +++ b/plugins/Scheduler/plugin.py @@ -67,7 +67,7 @@ class Scheduler(callbacks.Plugin): except IOError as e: self.log.debug('Unable to open pickle file: %s', e) return - for name, event in eventdict.iteritems(): + for name, event in eventdict.items(): ircobj = callbacks.ReplyIrcProxy(irc, event['msg']) try: if event['type'] == 'single': # non-repeating event @@ -197,7 +197,7 @@ class Scheduler(callbacks.Plugin): Lists the currently scheduled events. """ - L = self.events.items() + L = list(self.events.items()) if L: L.sort() for (i, (name, command)) in enumerate(L): diff --git a/plugins/ShrinkUrl/test.py b/plugins/ShrinkUrl/test.py index 5ab18a87f..79810515c 100644 --- a/plugins/ShrinkUrl/test.py +++ b/plugins/ShrinkUrl/test.py @@ -46,7 +46,7 @@ class ShrinkUrlTestCase(ChannelPluginTestCase): } if network: def testShrink(self): - for (service, testdata) in self.tests.iteritems(): + for (service, testdata) in self.tests.items(): for (url, shrunkurl) in testdata: self.assertRegexp('shrinkurl %s %s' % (service, url), shrunkurl) diff --git a/plugins/Todo/plugin.py b/plugins/Todo/plugin.py index 2809039cd..37782d0bf 100644 --- a/plugins/Todo/plugin.py +++ b/plugins/Todo/plugin.py @@ -69,7 +69,7 @@ class FlatTodoDb(object): return self.dbs[uid] def close(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.close() def get(self, uid, tid): diff --git a/plugins/User/plugin.py b/plugins/User/plugin.py index a62102361..21e5dde58 100644 --- a/plugins/User/plugin.py +++ b/plugins/User/plugin.py @@ -80,7 +80,7 @@ class User(callbacks.Plugin): return r.match(u.name) is not None predicates.append(p) users = [] - for u in ircdb.users.itervalues(): + for u in ircdb.users.values(): for predicate in predicates: if not predicate(u): break @@ -492,7 +492,7 @@ class User(callbacks.Plugin): owners = 0 admins = 0 hostmasks = 0 - for user in ircdb.users.itervalues(): + for user in ircdb.users.values(): users += 1 hostmasks += len(user.hostmasks) try: diff --git a/plugins/__init__.py b/plugins/__init__.py index 1dd6d728d..bafd1bbaa 100644 --- a/plugins/__init__.py +++ b/plugins/__init__.py @@ -128,7 +128,7 @@ class ChannelDBHandler(object): return db def die(self): - for db in self.dbCache.itervalues(): + for db in self.dbCache.values(): try: db.commit() except AttributeError: # In case it's not an SQLite database. @@ -158,11 +158,11 @@ class DbiChannelDB(object): return db def close(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.close() def flush(self): - for db in self.dbs.itervalues(): + for db in self.dbs.values(): db.flush() def __getattr__(self, attr): @@ -200,14 +200,14 @@ class ChannelUserDictionary(collections.MutableMapping): def __len__(self): return sum([len(x) for x in self.channels]) - def iteritems(self): - for (channel, ids) in self.channels.iteritems(): - for (id, v) in ids.iteritems(): + def items(self): + for (channel, ids) in self.channels.items(): + for (id, v) in ids.items(): yield ((channel, id), v) def keys(self): L = [] - for (k, _) in self.iteritems(): + for (k, _) in self.items(): L.append(k) return L @@ -252,7 +252,7 @@ class ChannelUserDB(ChannelUserDictionary): def flush(self): fd = utils.file.AtomicFile(self.filename, makeBackupIfSmaller=False) writer = csv.writer(fd) - items = self.items() + items = list(self.items()) if not items: log.debug('%s: Refusing to write blank file.', self.__class__.__name__) diff --git a/setup.py b/setup.py index d5d31079e..7db381dcb 100644 --- a/setup.py +++ b/setup.py @@ -158,7 +158,6 @@ try: log.debug(msg, *args) fixer_names = ['fix_basestring', - 'fix_dict', 'fix_imports', 'fix_long', 'fix_metaclass', 'fix_methodattrs', diff --git a/src/cdb.py b/src/cdb.py index b8ce48cbf..5ae465e6f 100644 --- a/src/cdb.py +++ b/src/cdb.py @@ -59,7 +59,7 @@ def pack2Ints(i, j): def dump(map, fd=sys.stdout): """Dumps a dictionary-structure in CDB format.""" - for (key, value) in map.iteritems(): + for (key, value) in map.items(): fd.write('+%s,%s:%s->%s\n' % (len(key), len(value), key, value)) def open_db(filename, mode='r', **kwargs): @@ -203,7 +203,7 @@ class Reader(utils.IterableMap): def _match(self, key, pos): return self._read(len(key), pos) == key - def iteritems(self): + def items(self): # uses loop/hslots in a strange, non-re-entrant manner. (self.loop,) = struct.unpack('', _cache[name] self.set(_cache[name]) if self._supplyDefault: - for (k, v) in _cache.iteritems(): + for (k, v) in _cache.items(): if k.startswith(self._name): rest = k[len(self._name)+1:] # +1 is for . parts = split(rest) @@ -382,7 +382,7 @@ class Value(Group): self._lastModified = time.time() self.value = v if self._supplyDefault: - for (name, v) in self._children.items(): + for (name, v) in list(self._children.items()): if v.__class__ is self.X: self.unregister(name) # We call the callback once everything is clean diff --git a/src/test.py b/src/test.py index acd810095..3e0b07e72 100644 --- a/src/test.py +++ b/src/test.py @@ -206,7 +206,7 @@ class PluginTestCase(SupyTestCase): ignoreDeprecation=True) cb = plugin.loadPluginClass(self.irc, module) self.irc.addCallback(TestInstance) - for (name, value) in self.config.iteritems(): + for (name, value) in self.config.items(): group = conf.supybot parts = registry.split(name) if parts[0] == 'supybot': @@ -220,7 +220,7 @@ class PluginTestCase(SupyTestCase): if self.__class__ in (PluginTestCase, ChannelPluginTestCase): # Necessary because there's a test in here that shouldn\'t run. return - for (group, original) in self.originals.iteritems(): + for (group, original) in self.originals.items(): group.setValue(original) ircdb.users.close() ircdb.ignores.close() diff --git a/src/utils/gen.py b/src/utils/gen.py index 9ee169fa2..a9006d0f9 100644 --- a/src/utils/gen.py +++ b/src/utils/gen.py @@ -36,6 +36,8 @@ import ast import time import types import textwrap +import warnings +import functools import traceback import collections @@ -48,6 +50,18 @@ from .iter import imap from supybot.i18n import PluginInternationalization _ = PluginInternationalization() +def warn_non_constant_time(f): + @functools.wraps(f) + def newf(*args, **kwargs): + # This method takes linear time whereas the subclass could probably + # do it in constant time. + warnings.warn('subclass of IterableMap does provide an efficient ' + 'implementation of %s' % f.__name__, + DeprecationWarning) + return f(*args, **kwargs) + return newf + + def abbrev(strings, d=None): """Returns a dictionary mapping unambiguous abbreviations to full forms.""" def eachSubstring(s): @@ -206,46 +220,35 @@ def exnToString(e): return e.__class__.__name__ class IterableMap(object): - """Define .iteritems() in a class and subclass this to get the other iters. + """Define .items() in a class and subclass this to get the other iters. """ - def iteritems(self): - if sys.version_info[0] >= 3 and hasattr(self, 'iteritems'): + def items(self): + if sys.version_info[0] >= 3 and hasattr(self, 'items'): # For old plugins - return getattr(self, 'iteritems')() # avoid 2to3 + return getattr(self, 'items')() # avoid 2to3 else: raise NotImplementedError() + __iter__ = items - def iterkeys(self): - for (key, _) in self.iteritems(): + def keys(self): + for (key, _) in self.items(): yield key - def itervalues(self): - for (_, value) in self.iteritems(): + def values(self): + for (_, value) in self.items(): yield value - if sys.version_info[0] < 3: - # Our 2to3 fixers automatically rename iteritems/iterkeys/itervalues - # to items/keys/values - def items(self): - return list(self.iteritems()) - - def keys(self): - return list(self.iterkeys()) - - def values(self): - return list(self.itervalues()) - __iter__ = iterkeys - else: - __iter__ = items + @warn_non_constant_time def __len__(self): ret = 0 - for _ in self.iteritems(): + for _ in self.items(): ret += 1 return ret + @warn_non_constant_time def __bool__(self): - for _ in self.iteritems(): + for _ in self.items(): return True return False __nonzero__ = __bool__ @@ -290,12 +293,15 @@ class InsensitivePreservingDict(collections.MutableMapping): def __len__(self): return len(self.data) - def iteritems(self): - return self.data.itervalues() + def items(self): + return self.data.values() + + def items(self): + return self.data.values() def keys(self): L = [] - for (k, _) in self.iteritems(): + for (k, _) in self.items(): L.append(k) return L diff --git a/src/utils/structures.py b/src/utils/structures.py index 65aae4423..a2a4da5e2 100644 --- a/src/utils/structures.py +++ b/src/utils/structures.py @@ -381,14 +381,14 @@ class MaxLengthQueue(queue): class TwoWayDictionary(dict): __slots__ = () def __init__(self, seq=(), **kwargs): - if hasattr(seq, 'iteritems'): - seq = seq.iteritems() + if hasattr(seq, 'items'): + seq = seq.items() elif hasattr(seq, 'items'): seq = seq.items() for (key, value) in seq: self[key] = value self[value] = key - for (key, value) in kwargs.iteritems(): + for (key, value) in kwargs.items(): self[key] = value self[value] = key @@ -445,8 +445,8 @@ class CacheDict(collections.MutableMapping): def keys(self): return self.d.keys() - def iteritems(self): - return self.d.iteritems() + def items(self): + return self.d.items() def __iter__(self): return iter(self.d) diff --git a/src/world.py b/src/world.py index 888d52578..a748b2339 100644 --- a/src/world.py +++ b/src/world.py @@ -192,7 +192,7 @@ def upkeep(): def makeDriversDie(): """Kills drivers.""" log.info('Killing Driver objects.') - for driver in drivers._drivers.itervalues(): + for driver in drivers._drivers.values(): driver.die() def makeIrcsDie(): diff --git a/test/test_utils.py b/test/test_utils.py index 083a393c0..719e602cd 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -118,7 +118,7 @@ class GenTest(SupyTestCase): def __setitem__(self, key, value): self.L.append((key, value)) - def iteritems(self): + def items(self): for (k, v) in self.L: yield (k, v) AL = alist() @@ -128,12 +128,12 @@ class GenTest(SupyTestCase): AL[3] = 4 self.failUnless(AL) self.assertEqual(list(AL.items()), [(1, 2), (2, 3), (3, 4)]) - self.assertEqual(list(AL.iteritems()), [(1, 2), (2, 3), (3, 4)]) + self.assertEqual(list(AL.items()), [(1, 2), (2, 3), (3, 4)]) self.assertEqual(list(AL.keys()), [1, 2, 3]) if sys.version_info[0] < 3: self.assertEqual(list(AL.iterkeys()), [1, 2, 3]) self.assertEqual(AL.values(), [2, 3, 4]) - self.assertEqual(list(AL.itervalues()), [2, 3, 4]) + self.assertEqual(list(AL.values()), [2, 3, 4]) self.assertEqual(len(AL), 3) def testSortBy(self):