рдкрд╛рдпрдерди рдореЗрдВ рддрд╛рд░реЛрдВ рдХреЛ рдЪрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдФрд░ рдЧреБрдЗрдбреЛ рдиреЗ рд╕реА рдХреА рдЫрд╡рд┐ рдореЗрдВ рддрд╛рд░ рдкреИрджрд╛ рдХрд┐рдП, рдкрд╛рддреНрд░реЛрдВ рдХреА рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдпрд╛ред рдФрд░ рдЧреБрдЗрдбреЛ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдерд╛ред рдпрд╛ рдирд╣реАрдВ?

рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЛ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред рд╕реБрдВрджрд░ рдмрджрд╕реВрд░рдд рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рд╕рд░рд▓ рдЬрдЯрд┐рд▓ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреЛрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд░реЛрдХрддреЗ рд╣реИрдВ:

from collections.abc import Iterable def traverse(list_or_value, callback): if isinstance(list_or_value, Iterable): for item in list_or_value: traverse(item, callback) else: callback(list_or_value) 

рдЖрдк рдПрдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪреЗрдВрдЧреЗ? рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╕ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди

 >>> traverse({"status": "ok"}, print) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in traverse File "<stdin>", line 4, in traverse File "<stdin>", line 4, in traverse [Previous line repeated 989 more times] File "<stdin>", line 2, in traverse File "/usr/local/opt/python/libexec/bin/../../Frameworks/Python.framework/Versions/3.7/lib/python3.7/abc.py", line 139, in __instancecheck__ return _abc_instancecheck(cls, instance) RecursionError: maximum recursion depth exceeded in comparison 

рдХреИрд╕реЗ? рдХреНрдпреЛрдВ? рдПрдХ рдЙрддреНрддрд░ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдЖрдк рдЕрдирдВрдд рдЧрд╣рд░рд╛рдИ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рдЕрджреНрднреБрдд рджреБрдирд┐рдпрд╛ рдореЗрдВ рдбреВрдм рдЬрд╛рдПрдВрдЧреЗред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд Iterable рдЬреЛ рд╣рдореЗрд╢рд╛ Iterable рдХреЛ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ! рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдХрд░ рдФрд░ рдПрдХ рдпрд╛ рджреЛ рдмрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рдЕрдХреНрд╕рд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ? рдФрд░ рд▓рд╛рдЗрди рдЕрдирдВрдд рдЧрд╣рд░рд╛рдИ рдХреА рд╣реИ, рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд░рд╛рдд рдХреЗ рдХрд╡рд░ рдХреЗ рдиреАрдЪреЗ рдЪреБрдкрдХреЗред

рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгред рдХрд╣реАрдВ рдХреЛрдб рдореЗрдВ, рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЖрдк рдПрдХ рд╕рд╣рд╛рдпрдХ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ __contains__ рд╡рд┐рдзрд┐ ( Container рдХреЗ рд╕рд╛рд░ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдзрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░-рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ - рдПрдХ рд╕рдВрдЧреНрд░рд╣ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рдмрд╕ рдЗрд╕рдХреЗ рд╕рд╛рде рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ set !

 import functools from typing import Collection, Container def faster_container(c: Container) -> Container: if isinstance(c, Collection): return set(c) return CachedContainer(c) class CachedContainer(object): def __init__(self, c: Container): self._contains = functools.lru_cache()(c.__contains__) def __contains__(self, stuff): return self._contains(stuff) 

III ... рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ! рдЦреИрд░ рдпрд╣рд╛рдБ! рдлрд┐рд░!

 >>> c = faster_container(othello_text) >>> "Have you pray'd to-night, Desdemona?" in c False 

(рд▓реЗрдХрд┐рди рдЧрд▓рдд рдЬрд╡рд╛рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд▓реНрджреА рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ...)

рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рдЕрджреНрднреБрдд рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рд╕рдореЗрдВ __contains__ рд╡рд┐рдзрд┐ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде __iter__ рдФрд░ __len__ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ __contains__ ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ:

 >>> from collections.abc import Collection >>> issubclass(str, Collection) True 

рд▓реЗрдХрд┐рди рд╕рдВрдЧреНрд░рд╣ ... рдХреНрдпрд╛? __iter__ рдФрд░ __len__ рдЗрд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдорд╛рдирддреЗ рд╣реИрдВ:

 >>> s = "foo" >>> len(s) 3 >>> list(s) ['f', 'o', 'o'] 

рд▓реЗрдХрд┐рди __contains__ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ!

 >>> "oo" in s True >>> "oo" in list(s) False 

рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?


рд╣рд╛рд▓рд╛рдВрдХрд┐ str.__contains__ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ __contains__ str.__contains__ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред __contains__ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдиреНрдп рдорд╛рдирдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдИ рдЫреЛрдЯреА рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдкрд╛рдпрдерди рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ; рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рддреЗрдЬрд╝ рдФрд░ рд╕рд╛рд╣рд┐рддреНрдпрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рд╣рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХрд▓ рдЪрд░рд┐рддреНрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдХрднреА рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдФрд░ рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд▓рдЧрднрдЧ рдХрднреА рднреА рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ! рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪ - рдЕрдХреНрд╕рд░ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдирд┐рдпрддрд┐ред рддреЛ, рд╢рд╛рдпрдж рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ __iter__ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ рдХреБрдЫ рд╡рд┐рдзрд┐ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛рдПрдВ рдЬреИрд╕реЗ .chars() ? рдЗрд╕рд╕реЗ рдЗрди рджреЛрдиреЛрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╢реБрдХреНрд░рд╡рд╛рд░ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рдордп!

Source: https://habr.com/ru/post/hi451252/


All Articles