рдкрд╛рдЗрдерди рдореЗрдВ рдЬреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд╛рд░реНрдо рдЕрдк рдХрд░реЗрдВ

рдирдорд╕реНрддреЗ! рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реА рдкрд╕рдВрдж рд╣реИред рд╣рдордиреЗ рдЕрдкрдиреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рдкреЛрд╕реНрдЯ рдХрд┐рдП рд╣реИрдВ: рдкрд╣рд▓рд╛ - рдкрд╛рдпрдерди, рдкреАрдПрдЪрдкреА, рдЧреЛрд▓рдВрдЧ, рджреЗрд╡рдУрдкреНрд╕ рдореЗрдВ, рджреВрд╕рд░рд╛ - рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧреЛ рдореЗрдВ, рддреАрд╕рд░рд╛ - рдХреЗрд╡рд▓ PHP рдореЗрдВред рдЖрдЬ рдХреА рдкреНрд░рд╢реНрдиреЛрддреНрддрд░реА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдХреЛ рд╕рдорд░реНрдкрд┐рдд рд╣реИред


рд╣рдо рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдЧрд░реНрдореА рдХреЗ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдФрд░ PyCon рд░реВрд╕ 2018 рдХреА рдкреВрд░реНрд╡ рд╕рдВрдзреНрдпрд╛ рдкрд░ рдЧрд░реНрдордЬреЛрд╢реА рд╕реЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред (рд╡реИрд╕реЗ, рдХреМрди рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рд╣рдо рд╡рд╣рд╛рдВ рд╣реЛрдВрдЧреЗ)ред


рдХрдЯреМрддреА рдХреЗ рддрд╣рдд - рд╕рд╛рдд рд╕рд╡рд╛рд▓, рдПрдХ рджреЛрд╕реНрдд, рдЪрдкрд╛рдПрд╡ рдХреА рд╕рд▓рд╛рд╣, рдПрдмреАрдмреАрдП рдХреЗ рдЕрдВрд╢ ( рдХреНрдпрд╛? рд╣рд╛рдБ! ) рдФрд░ рдПрдХ рд╢рд╛рдВрдд рдЪреБрдЯрдХреАред


UPD: рд╣рдордиреЗ рдЙрддреНрддрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рдкрд╛рда рдХреЗ рдЕрдВрджрд░ рд╣реИрдВ, рдФрд░ рд╡рд┐рдЬреЗрддрд╛ рдФрд░ рдкреБрд░рд╕реНрдХрд╛рд░ рд╡рд┐рдЬреЗрддрд╛ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд╣реИрдВред


рдХреНрд╡рд┐рдЬрд╝ рдХреЗ рд╡рд┐рдЬреЗрддрд╛ рдФрд░ рдкреБрд░рд╕реНрдХрд╛рд░ рд╡рд┐рдЬреЗрддрд╛

рд╡рд┐рдЬреЗрддрд╛


Vadem


рдкреБрд░рд╕реНрдХрд╛рд░ рд╡рд┐рдЬреЗрддрд╛рдУрдВ


рджреВрд╕рд░рд╛ рд╕реНрдерд╛рди: рдПрд╕рд┐рдХрд╛рдЗрдлреА
рддреАрд╕рд░рд╛ рд╕реНрдерд╛рди: рд╣рд┐рд╕реНрдЯреЛрдлреНрд░реА
рдЪреМрдерд╛ - рджрд╕рд╡рд╛рдВ рд╕реНрдерд╛рди: рд╕реНрд╡реЗрдЬрд╝реА_рдЖ , рд╕реНрд▓реЛрдирдкреАрд╕реА , рдиреЙрдЯ , IIRoadRunnerII , term1nal , alexchromets , Tihon_V ред


рдмреЛрдирд╕


рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рд╕рд╣реА рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рдХрд┐ рд╣рдордиреЗ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЙрдирдХреЗ рдмреАрдЪ рдкрд╛рдВрдЪ рдЬреЛрдбрд╝реА рдореЛрдЬреЗ рдЦреЗрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдПрд╡рд┐рдЯреЛ рд╕реЗ рдХреВрд▓ рдореЛрдЬрд╝реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ: рд╕рдирдореИрди , grt_pretender , рд╡рд╢ , ipatov_dn , рдЗрдВрд╕реНрдЯрд┐рдЯреЛрд░рд┐рд╕


рд░рд┐рдХреЙрд░реНрдб рдмрдирд╛рдПрдВ




рдкреБрд░рд╕реНрдХрд╛рд░


рд╢реАрд░реНрд╖ рджрд╕ рдХреЗ рдмреАрдЪ рдкреБрд░рд╕реНрдХрд╛рд░ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдкрд╛рдпрдерди рдХреНрд╡рд┐рдЬрд╝ рдХреЗ рд╕рднреА рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ , рд╣рдо рдПрдХ рдЙрдиреНрдирдд рдПрд╡рд┐рдЯреЛ-рдорд░реНрдЪ рдХрд┐рдЯ рднреЗрдЬреЗрдВрдЧреЗ: рдПрдХ рд╕реНрд╡реЗрдЯрд╢рд░реНрдЯ, рдореЛрдЬрд╝реЗ рдФрд░ рдЦреЛрдЦрд▓реА рд╣рдбреНрдбрд┐рдпрд╛рдБ - рдЖрдк рдЕрдВрджрд╛рдЬрд╝рд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдмреИрдХрдПрдВрдб рд▓реИрдВрдЧреНрд╡реЗрдЬ рдФрд░ рдлреНрд░рдВрдЯреЗрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реЛрдЧрд╛ред рдХрд╛рд░реНрдп рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреВрд╕рд░реЗ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЛ рд╣реЛрд▓реАрд╡реЙрди, рдореЛрдЬреЗ рдФрд░ рдПрдХ рдЯреА-рд╢рд░реНрдЯ рд╕реЗ рд╕рдореНрдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рддреАрд╕рд░реЗ рдХреЛ рдПрдХ рд╣реА рд╕реЗрдЯ рдорд┐рд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдЯреА-рд╢рд░реНрдЯ / рд╕реНрд╡реЗрдЯрд╢рд░реНрдЯ рдХреЗред рд╢реЗрд╖ рд╕рд╛рдд рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдПрдХ рдХрд╛рд░реНрдмрд╛рдЗрди рдХреЗ рд╕рд╛рде рдПрдХ рдерд░реНрдорд▓ рдмреЛрддрд▓ рдЦреЗрд▓реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рд╛рдЗрдХ рдкрд░ рднреА рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╣реИрдХрд╛рдереЙрди рдкрд░ред


рдЫрд╡рд┐


рд╕рд╡рд╛рд▓


* рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╣рдо рдкрд╛рдпрдерди 3 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдкреНрд░рд╢реНрди 1


рдЪрд░ t рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛:


 >>> t = (1, 2, [30,40]) >>> t[2] += [50, 60] 

рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • TypeError рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛, t рд╣реЛрдЧрд╛ (1, 2, [30, 40, 50, 60]) ,
  • TypeError рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛, t рд╣реЛрдЧрд╛ (1, 2, [30, 40]) ,
  • (1, 2, [30, 40, 50, 60]) ,
  • (1, 2, [30, 40]) ред

рд╕рд╣реА рдЙрддреНрддрд░

TypeError рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛, t рд╣реЛрдЧрд╛ (1, 2, [30, 40, 50, 60])


рдкреНрд░рд╢реНрди реи


рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореЙрдбреНрдпреВрд▓ рдХреА рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рд╣реИ:


 foo_app/ snatch/ qwerty.py bar_app/ snatch/ mamamia.py 

рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЖрдк рдЗрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЛрдб рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХреЗрдВ:


 from snatch import qwerty, mamamia 

рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, export PYTHONPATH=foo_pp:br_pp рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ export PYTHONPATH=foo_pp:br_pp ,
  • рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛрдбрд╝реЗрдВ:
     import sys sys.path.extend(['foo_app', 'bar_app']) 
  • рдКрдкрд░ рджрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ,
  • рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╣реА рдЙрддреНрддрд░

рдКрдкрд░ рджрд┐рдП рдЧрдП рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ


рдкреНрд░рд╢реНрди 3


рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ:


 class A: def get_some(self): super().get_some() class B: def get_some(self): print('Some') class C(A, B): def get_some(self): super().get_some() c = C() c.get_some() 

рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • AttributeError: 'C' object has no attribute 'get_some' ,
  • AttributeError: 'super' object has no attribute 'get_some' ,
  • Some ,
  • рд╢реВрдиреНрдпрддрд╛ (рдмрд┐рдирд╛ рдЪреИрдкрд╛рдП)ред

рд╕рд╣реА рдЙрддреНрддрд░

Some


рдкреНрд░рд╢реНрди 4


рдЬрдм рдЖрдк рдпрд╣ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:


 class A: def foo(self): print('foo A') class B: def foo(self): print('foo B') class C(A, B): def foo(self): super().foo() class D(B, A): def foo(self): super().foo() class E(C, D): pass e = E() e.foo() 

рдЙрддреНрддрд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк


  • foo A ,
  • foo B ,
  • TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B

рд╕рд╣реА рдЙрддреНрддрд░

TypeError: Cannot create a consistent method resolution order (MRO) for bases A, B


рдкреНрд░рд╢реНрди 5


рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдореЙрдбреНрдпреВрд▓ foo.py рд╣реИ:


 def bar(): print(', !') 

рдФрд░ рдЖрдк рдПрдХ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ:


 import importlib import foo from foo import bar input(',  ') importlib.reload(foo) bar() 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЗрдирдкреБрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдк foo.py рдореЙрдбреНрдпреВрд▓ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:


 def bar(): print(', !') 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк "рдЗрдирдкреБрдЯ" рдХреЛ foo.py рдореЗрдВ рджрдмрд╛рдПрдВ рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВ ...


рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • ModuleReloadedException: method bar() was reloaded ,
  • , ! ред
  • , ! ред
  • рд╢реВрдиреНрдпрддрд╛ (рдФрд░ рдлрд┐рд░ рд╕реЗ рдХреЛрдИ рдЪрдкрд╛рдПрд╡ рдирд╣реАрдВ рд╣реИ)ред

рд╕рд╣реА рдЙрддреНрддрд░

, !


рдкреНрд░рд╢реНрди 6


рдЬрдм рдЖрдк рдпрд╣ рдХреЛрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдЧрд╛:


 class A: def __init__(self): print('__init__ A', end=' ') class B: def __init__(self): print('__init__ B', end=' ') class C(A, B): pass c = C() 

рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • __init__ A __init__ B
  • __init__ B __init__ A
  • __init__ A
  • __init__ B

рд╕рд╣реА рдЙрддреНрддрд░

__init__ A


рдкреНрд░рд╢реНрди 7


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


 def not_(value): return not value result = not_(0), all(any([not_(x) for x in range(b)]) for b in range(10)) print(result) 

рдЙрддреНрддрд░ рд╡рд┐рдХрд▓реНрдк:


  • (True, True) ,
  • (True, False) ,
  • ValueError: need more than 2 values to unpack ,
  •  def not_(value): return value ^ SyntaxError: invalid syntax 


рд╕рд╣реА рдЙрддреНрддрд░

(True, False)


рд╕рдВрдХреНрд╖реЗрдк


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

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


All Articles