Current Dir: /snap/core22/2955/usr/lib/python3.11/lib2to3/fixes/
[FILE] fix_apply.py [ edit | delete | rename ]
[FILE] fix_asserts.py [ edit | delete | rename ]
[FILE] fix_basestring.py [ edit | delete | rename ]
[FILE] fix_buffer.py [ edit | delete | rename ]
[FILE] fix_dict.py [ edit | delete | rename ]
[FILE] fix_except.py [ edit | delete | rename ]
[FILE] fix_exec.py [ edit | delete | rename ]
[FILE] fix_execfile.py [ edit | delete | rename ]
[FILE] fix_exitfunc.py [ edit | delete | rename ]
[FILE] fix_filter.py [ edit | delete | rename ]
[FILE] fix_funcattrs.py [ edit | delete | rename ]
[FILE] fix_future.py [ edit | delete | rename ]
[FILE] fix_getcwdu.py [ edit | delete | rename ]
[FILE] fix_has_key.py [ edit | delete | rename ]
[FILE] fix_idioms.py [ edit | delete | rename ]
[FILE] fix_import.py [ edit | delete | rename ]
[FILE] fix_imports.py [ edit | delete | rename ]
[FILE] fix_imports2.py [ edit | delete | rename ]
[FILE] fix_input.py [ edit | delete | rename ]
[FILE] fix_intern.py [ edit | delete | rename ]
[FILE] fix_isinstance.py [ edit | delete | rename ]
[FILE] fix_itertools.py [ edit | delete | rename ]
[FILE] fix_itertools_imports.py [ edit | delete | rename ]
[FILE] fix_long.py [ edit | delete | rename ]
[FILE] fix_map.py [ edit | delete | rename ]
[FILE] fix_metaclass.py [ edit | delete | rename ]
[FILE] fix_methodattrs.py [ edit | delete | rename ]
[FILE] fix_ne.py [ edit | delete | rename ]
[FILE] fix_next.py [ edit | delete | rename ]
[FILE] fix_nonzero.py [ edit | delete | rename ]
[FILE] fix_numliterals.py [ edit | delete | rename ]
[FILE] fix_operator.py [ edit | delete | rename ]
[FILE] fix_paren.py [ edit | delete | rename ]
[FILE] fix_print.py [ edit | delete | rename ]
[FILE] fix_raise.py [ edit | delete | rename ]
[FILE] fix_raw_input.py [ edit | delete | rename ]
[FILE] fix_reduce.py [ edit | delete | rename ]
[FILE] fix_reload.py [ edit | delete | rename ]
[FILE] fix_renames.py [ edit | delete | rename ]
[FILE] fix_repr.py [ edit | delete | rename ]
[FILE] fix_set_literal.py [ edit | delete | rename ]
[FILE] fix_standarderror.py [ edit | delete | rename ]
[FILE] fix_sys_exc.py [ edit | delete | rename ]
[FILE] fix_throw.py [ edit | delete | rename ]
[FILE] fix_tuple_params.py [ edit | delete | rename ]
[FILE] fix_types.py [ edit | delete | rename ]
[FILE] fix_unicode.py [ edit | delete | rename ]
[FILE] fix_urllib.py [ edit | delete | rename ]
[FILE] fix_ws_comma.py [ edit | delete | rename ]
[FILE] fix_xrange.py [ edit | delete | rename ]
[FILE] fix_xreadlines.py [ edit | delete | rename ]
[FILE] fix_zip.py [ edit | delete | rename ]
[FILE] __init__.py [ edit | delete | rename ]
Viewing: /snap/core22/2955/usr/lib/python3.11/lib2to3/fixes/fix_has_key.py
# Copyright 2006 Google, Inc. All Rights Reserved.
# Licensed to PSF under a Contributor Agreement.
"""Fixer for has_key().
Calls to .has_key() methods are expressed in terms of the 'in'
operator:
d.has_key(k) -> k in d
CAVEATS:
1) While the primary target of this fixer is dict.has_key(), the
fixer will change any has_key() method call, regardless of its
class.
2) Cases like this will not be converted:
m = d.has_key
if m(k):
...
Only *calls* to has_key() are converted. While it is possible to
convert the above to something like
m = d.__contains__
if m(k):
...
this is currently not done.
"""
# Local imports
from .. import pytree
from .. import fixer_base
from ..fixer_util import Name, parenthesize
class FixHasKey(fixer_base.BaseFix):
BM_compatible = True
PATTERN = """
anchor=power<
before=any+
trailer< '.' 'has_key' >
trailer<
'('
( not(arglist | argument<any '=' any>) arg=any
| arglist<(not argument<any '=' any>) arg=any ','>
)
')'
>
after=any*
>
|
negation=not_test<
'not'
anchor=power<
before=any+
trailer< '.' 'has_key' >
trailer<
'('
( not(arglist | argument<any '=' any>) arg=any
| arglist<(not argument<any '=' any>) arg=any ','>
)
')'
>
>
>
"""
def transform(self, node, results):
assert results
syms = self.syms
if (node.parent.type == syms.not_test and
self.pattern.match(node.parent)):
# Don't transform a node matching the first alternative of the
# pattern when its parent matches the second alternative
return None
negation = results.get("negation")
anchor = results["anchor"]
prefix = node.prefix
before = [n.clone() for n in results["before"]]
arg = results["arg"].clone()
after = results.get("after")
if after:
after = [n.clone() for n in after]
if arg.type in (syms.comparison, syms.not_test, syms.and_test,
syms.or_test, syms.test, syms.lambdef, syms.argument):
arg = parenthesize(arg)
if len(before) == 1:
before = before[0]
else:
before = pytree.Node(syms.power, before)
before.prefix = " "
n_op = Name("in", prefix=" ")
if negation:
n_not = Name("not", prefix=" ")
n_op = pytree.Node(syms.comp_op, (n_not, n_op))
new = pytree.Node(syms.comparison, (arg, n_op, before))
if after:
new = parenthesize(new)
new = pytree.Node(syms.power, (new,) + tuple(after))
if node.parent.type in (syms.comparison, syms.expr, syms.xor_expr,
syms.and_expr, syms.shift_expr,
syms.arith_expr, syms.term,
syms.factor, syms.power):
new = parenthesize(new)
new.prefix = prefix
return new