240
241
242def _escape_argspec(
243 obj: _ListOrDict, iterable: t.Iterable[t.Any], escape: t.Callable[[t.Any], Markup]244) -> _ListOrDict:
245 """Helper for various string-wrapped functions."""
246 for key, value in iterable:
255
256 __slots__ = ("obj", "escape")
257
258 def __init__(self, obj: t.Any, escape: t.Callable[[t.Any], Markup]) -> None:259 self.obj = obj
260 self.escape = escape
261
214class EscapeFormatter(string.Formatter):
215 __slots__ = ("escape",)
216
217 def __init__(self, escape: t.Callable[[t.Any], Markup]) -> None:218 self.escape = escape
219 super().__init__()
220
484
485
486def unicode_urlencode(obj: t.Any, charset: str = "utf-8", for_qs: bool = False) -> str:
487 import warnings488
489 warnings.warn(
490 "'unicode_urlencode' has been renamed to 'url_quote'. The old"
248
249def pformat(obj: t.Any) -> str:
250 """Format an object using :func:`pprint.pformat`."""
251 from pprint import pformat # type: ignore252
253 return pformat(obj)
254
The local variable name hides the variable defined in the outer scope, making it inaccessible and might confuse.
filename = 'myfile.txt'
def read_file(filename): # This shadows the global `filename`
with open(filename) as file:
return file.readlines()
FILENAME = 'myfile.txt' # renamed global to UPPER_CASE as convention
def read_file(filename):
with open(filename) as file:
return file.readlines()
Another usual suspect of this is when you use the same parameter name inside a function as the global variable you are using. For example:
def run_app(app):
# This `app` shadows the global app...
app.run()
if __name__ == '__main__':
app = MyApp() # This is a global variable!
run_app(app)
To avoid this re-defining of a global, consider not defining app
as a global, but inside a main()
function instead:
def run_app(app):
# There is no longer a global `app` variable.
app.run()
def main():
app = MyApp()
run_app(app)
if __name__ == '__main__':
main()