summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2010-01-30 10:56:23 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2010-01-30 10:56:23 (GMT)
commita8e34b707c89d50fe236ce1e817ac53a3a036c25 (patch)
treed47d80d0a496998344df33145c5c2907a774e429 /Lib
parenta36507c64cd8d299749c758503b0951070e202f8 (diff)
downloadcpython-a8e34b707c89d50fe236ce1e817ac53a3a036c25.zip
cpython-a8e34b707c89d50fe236ce1e817ac53a3a036c25.tar.gz
cpython-a8e34b707c89d50fe236ce1e817ac53a3a036c25.tar.bz2
Merged revisions 77419,77435 via svnmerge from
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3 ........ r77419 | benjamin.peterson | 2010-01-10 21:39:48 +0100 (So, 10 Jan 2010) | 1 line enclose path in quotes to handle paths with spaces correctly #7666 ........ r77435 | alexandre.vassalotti | 2010-01-12 01:36:54 +0100 (Di, 12 Jan 2010) | 2 lines Issue #1967: Add fixer for dictionary views. ........
Diffstat (limited to 'Lib')
-rw-r--r--Lib/lib2to3/fixes/fix_dict.py14
-rwxr-xr-xLib/lib2to3/tests/test_fixers.py58
-rw-r--r--Lib/lib2to3/tests/test_parser.py2
3 files changed, 69 insertions, 5 deletions
diff --git a/Lib/lib2to3/fixes/fix_dict.py b/Lib/lib2to3/fixes/fix_dict.py
index 5dcbdd0..5912cbf 100644
--- a/Lib/lib2to3/fixes/fix_dict.py
+++ b/Lib/lib2to3/fixes/fix_dict.py
@@ -11,6 +11,10 @@ d.iterkeys() -> iter(d.keys())
d.iteritems() -> iter(d.items())
d.itervalues() -> iter(d.values())
+d.viewkeys() -> d.keys()
+d.viewitems() -> d.items()
+d.viewvalues() -> d.values()
+
Except in certain very specific contexts: the iter() can be dropped
when the context is list(), sorted(), iter() or for...in; the list()
can be dropped when the context is list() or sorted() (but not iter()
@@ -39,7 +43,8 @@ class FixDict(fixer_base.BaseFix):
PATTERN = """
power< head=any+
trailer< '.' method=('keys'|'items'|'values'|
- 'iterkeys'|'iteritems'|'itervalues') >
+ 'iterkeys'|'iteritems'|'itervalues'|
+ 'viewkeys'|'viewitems'|'viewvalues') >
parens=trailer< '(' ')' >
tail=any*
>
@@ -52,9 +57,10 @@ class FixDict(fixer_base.BaseFix):
syms = self.syms
method_name = method.value
isiter = method_name.startswith(u"iter")
- if isiter:
+ isview = method_name.startswith(u"view")
+ if isiter or isview:
method_name = method_name[4:]
- assert method_name in ("keys", "items", "values"), repr(method)
+ assert method_name in (u"keys", u"items", u"values"), repr(method)
head = [n.clone() for n in head]
tail = [n.clone() for n in tail]
special = not tail and self.in_special_context(node, isiter)
@@ -64,7 +70,7 @@ class FixDict(fixer_base.BaseFix):
prefix=method.prefix)]),
results["parens"].clone()]
new = pytree.Node(syms.power, args)
- if not special:
+ if not (special or isview):
new.prefix = u""
new = Call(Name(u"iter" if isiter else u"list"), [new])
if tail:
diff --git a/Lib/lib2to3/tests/test_fixers.py b/Lib/lib2to3/tests/test_fixers.py
index cf4ebc3..417ed2f 100755
--- a/Lib/lib2to3/tests/test_fixers.py
+++ b/Lib/lib2to3/tests/test_fixers.py
@@ -1215,6 +1215,14 @@ class Test_dict(FixerTestCase):
a = "[i for i in d. keys( ) ]"
self.check(b, a)
+ b = "if d. viewkeys ( ) : pass"
+ a = "if d. keys ( ) : pass"
+ self.check(b, a)
+
+ b = "[i for i in d. viewkeys( ) ]"
+ a = "[i for i in d. keys( ) ]"
+ self.check(b, a)
+
def test_trailing_comment(self):
b = "d.keys() # foo"
a = "list(d.keys()) # foo"
@@ -1234,6 +1242,16 @@ class Test_dict(FixerTestCase):
]"""
self.check(b, a)
+ b = """[i for i in d.iterkeys() # foo
+ ]"""
+ a = """[i for i in d.keys() # foo
+ ]"""
+ self.check(b, a)
+
+ b = "d.viewitems() # foo"
+ a = "d.items() # foo"
+ self.check(b, a)
+
def test_unchanged(self):
for wrapper in fixer_util.consuming_calls:
s = "s = %s(d.keys())" % wrapper
@@ -1367,6 +1385,46 @@ class Test_dict(FixerTestCase):
a = "for x in list(h.keys())[0]: print x"
self.check(b, a)
+ def test_25(self):
+ b = "d.viewkeys()"
+ a = "d.keys()"
+ self.check(b, a)
+
+ def test_26(self):
+ b = "d.viewitems()"
+ a = "d.items()"
+ self.check(b, a)
+
+ def test_27(self):
+ b = "d.viewvalues()"
+ a = "d.values()"
+ self.check(b, a)
+
+ def test_14(self):
+ b = "[i for i in d.viewkeys()]"
+ a = "[i for i in d.keys()]"
+ self.check(b, a)
+
+ def test_15(self):
+ b = "(i for i in d.viewkeys())"
+ a = "(i for i in d.keys())"
+ self.check(b, a)
+
+ def test_17(self):
+ b = "iter(d.viewkeys())"
+ a = "iter(d.keys())"
+ self.check(b, a)
+
+ def test_18(self):
+ b = "list(d.viewkeys())"
+ a = "list(d.keys())"
+ self.check(b, a)
+
+ def test_19(self):
+ b = "sorted(d.viewkeys())"
+ a = "sorted(d.keys())"
+ self.check(b, a)
+
class Test_xrange(FixerTestCase):
fixer = "xrange"
diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py
index fb412d0..92fe522 100644
--- a/Lib/lib2to3/tests/test_parser.py
+++ b/Lib/lib2to3/tests/test_parser.py
@@ -209,6 +209,6 @@ def diff(fn, result, encoding):
finally:
f.close()
try:
- return os.system("diff -u %s @" % fn)
+ return os.system("diff -u %r @" % fn)
finally:
os.remove("@")