
рдпрд╣ рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрд╕ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдирдпрд╛ рдЪрдпрди рд╣реИред
рдПрдХрд╛рдзрд┐рдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ
рдХрднреА-рдХрднреА рдЖрдк рдХрдИ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рдмреНрд▓реЙрдХ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
with open('f') as f: with open('g') as g: with open('h') as h: pass
рдкрд╛рдпрдерди 2.7 рдФрд░ 3.1 рдХреЗ рдмрд╛рдж рд╕реЗ, рдЖрдк рдЗрд╕реЗ рдПрдХрд▓ рдХреЗ
with
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
o = open with o('f') as f, o('g') as g, o('h') as h: pass
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк Referencelib.nested рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
with nested(o('f'), o('g'), o('h')) as (f, g, h): pass
рдпрджрд┐ рдЖрдк рдЕрдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
contextlib.ExitStack
рдЖрдкрдХреЛ рдордирдорд╛рдиреЗ рд╕рдордп рдкрд░ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ:
with ExitStack() as stack: f = stack.enter_context(o('f')) g = stack.enter_context(o('g')) other = [ stack.enter_context(o(filename)) for filename in filenames ]
рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрдВрдЯрд░рдкреНрд░реЗрдЯрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдореМрдЬреВрдж рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ
gc.get_objects()
рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
In : class A: ...: def __init__(self, x): ...: self._x = x ...: ...: def __repr__(self): ...: class_name = type(self).__name__ ...: x = self._x ...: return f'{class_name}({x!r})' ...: In : A(1) Out: A(1) In : A(2) Out: A(2) In : A(3) Out: A(3) In : [x for x in gc.get_objects() if isinstance(x, A)] Out: [A(1), A(2), A(3)]
рдЕрдВрдХ рдЪрд┐рдиреНрд╣
In : int('рнзрзмр╝г') Out: 163
0 1 2 3 4 5 6 7 8 9
- рдХреЗрд╡рд▓ рдЕрдХреНрд╖рд░ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдВрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдпреВрдирд┐рдХреЛрдб рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрдИ рд╕реИрдХрдбрд╝реЛрдВ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдЕрдВрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдкреВрд░реА рд╕реВрдЪреА (http://www.fileformat.info/info/unicode/category/Nd/list.htm) рд╣реИред
рдпрд╣
int
,
unicode.isdecimal
рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
re.match
рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ:
In : int('р╖п') Out: 9 In : '┘в'.isdecimal() Out: True In : bool(re.match('\d', 'р▒л')) Out: True
рдпреВрдЯреАрд╕реА рдЖрдзреА рд░рд╛рдд
>>> bool(datetime(2018, 1, 1).time()) False >>> bool(datetime(2018, 1, 1, 13, 12, 11).time()) True
рдкрд╛рдпрдерди 3.5 рд╕реЗ рдкрд╣рд▓реЗ,
datetime.time()
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЭреВрдард╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ рдпрджрд┐ рд╡реЗ рдпреВрдЯреАрд╕реА рдЖрдзреА рд░рд╛рдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рдереЗред рдЬрд┐рд╕рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдХреАрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ
if not
рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐
create_time
None
, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдзреА рд░рд╛рдд рд╣реИред
def create(created_time=None) -> None: if not created_time: created_time = datetime.now().time()
рдЖрдк рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП
None
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
if created_time is None
ред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдзрд╛рдЧреЗ рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
loop.run_in_executor
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ
aiofiles
рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рд░рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
async with aiofiles.open('filename', mode='r') as f: contents = await f.read()
рд╕реНрд░реЛрдд:
habr.com/ru/company/mailru/blog/436322