Merged revisions 77846 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ................ r77846 | martin.v.loewis | 2010-01-30 11:56:23 +0100 (Sa, 30 Jan 2010) | 13 lines 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. ........ ................
This commit is contained in:
parent
13ea1f926f
commit
98d76a9a90
|
@ -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("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.get_prefix())]),
|
||||
results["parens"].clone()]
|
||||
new = pytree.Node(syms.power, args)
|
||||
if not special:
|
||||
if not (special or isview):
|
||||
new.set_prefix("")
|
||||
new = Call(Name(isiter and "iter" or "list"), [new])
|
||||
if tail:
|
||||
|
|
|
@ -1187,6 +1187,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"
|
||||
|
@ -1206,6 +1214,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
|
||||
|
@ -1339,6 +1357,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"
|
||||
|
||||
|
|
|
@ -192,7 +192,7 @@ def diff(fn, tree):
|
|||
finally:
|
||||
f.close()
|
||||
try:
|
||||
return os.system("diff -u %s @" % fn)
|
||||
return os.system("diff -u %r @" % fn)
|
||||
finally:
|
||||
os.remove("@")
|
||||
|
||||
|
|
Loading…
Reference in New Issue