File: dictlist.py

package info (click to toggle)
python-hacking 4.1.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 380 kB
  • sloc: python: 1,503; sh: 38; makefile: 23
file content (46 lines) | stat: -rw-r--r-- 1,518 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#  Licensed under the Apache License, Version 2.0 (the "License"); you may
#  not use this file except in compliance with the License. You may obtain
#  a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#  License for the specific language governing permissions and limitations
#  under the License.

import tokenize

from hacking import core


LOCALS_TEXT_MAP = {
    'locals': 'locals()',
    'self': 'self.__dict__'
}


@core.flake8ext
def hacking_no_locals(logical_line, tokens, noqa):
    """Do not use locals() or self.__dict__ for string formatting.

    Okay: 'locals()'
    Okay: 'locals'
    Okay: locals()
    Okay: print(locals())
    H501: print("%(something)" % locals())
    H501: LOG.info(_("%(something)") % self.__dict__)
    Okay: print("%(something)" % locals())  # noqa
    """
    if noqa:
        return
    for_formatting = False
    for token_type, text, start, _, _ in tokens:
        if text == "%" and token_type == tokenize.OP:
            for_formatting = True
        if for_formatting and token_type == tokenize.NAME:
            for k, v in LOCALS_TEXT_MAP.items():
                if text == k and v in logical_line:
                    yield (start[1],
                           "H501: Do not use %s for string formatting" % v)