Գվիդո վան Ռոսսումն առաջարկեց Python-ին ավելացնել օրինաչափությունների համապատասխանող օպերատորներ

Գվիդո վան Ռոսում ներկայացրեց նախագիծ համայնքի վերանայման համար բնութագրերը Python-ում օրինաչափությունների համապատասխանող օպերատորների (match և case) ներդրման համար: Հարկ է նշել, որ օրինաչափությունների համապատասխանող օպերատորներ ավելացնելու առաջարկներն արդեն հրապարակվել են 2001 և 2006 թվականներին (pep-0275, pep-3103), սակայն մերժվեցին՝ հօգուտ «եթե ... էլիֆ ... ուրիշ» կառուցվածքի օպտիմալացման՝ համապատասխան շղթաներ կազմելու համար։

Նոր իրականացումը շատ նման է Scala-ում, Rust-ում և F#-ում տրված «match» օպերատորին, որը համեմատում է նշված արտահայտության արդյունքը «case» օպերատորի վրա հիմնված բլոկներում թվարկված օրինաչափությունների ցանկի հետ: Ի տարբերություն «switch» օպերատորի, որը հասանելի է C, Java և JavaScript-ում, «match»-ի վրա հիմնված արտահայտությունները շատ ավելին են առաջարկում։ լայն ֆունկցիոնալություն. Նշվում է, որ առաջարկվող օպերատորները կբարելավեն կոդի ընթեռնելիությունը, կպարզեցնեն կամայական Python օբյեկտների համեմատությունը և վրիպազերծումը, ինչպես նաև կբարձրացնեն կոդի հուսալիությունը՝ ընդլայնված հնարավորության շնորհիվ: ստատիկ տիպի ստուգում.

def http_error(status):
համընկնումի կարգավիճակը:
գործ 400:
վերադարձնել «Վատ խնդրանք»
գործ 401|403|404:
վերադարձ «Չի թույլատրվում»
գործ 418:
վերադարձ «Ես թեյնիկ եմ»
case_:
վերադարձնել «Ուրիշ բան»

Օրինակ, դուք կարող եք բացել առարկաները, բազմոցները, ցուցակները և կամայական հաջորդականությունները՝ գոյություն ունեցող արժեքների հիման վրա փոփոխականները կապելու համար: Թույլատրվում է սահմանել տեղադրված կաղապարներ, օգտագործել լրացուցիչ «եթե» պայմաններ կաղապարում, օգտագործել դիմակներ («[x, y, *rest]»), բանալիների/արժեքների քարտեզագրում (օրինակ՝ {«թողունակություն»՝ b, «latency»: l} «թողունակության» և «լատենտության» արժեքները և բառարանը հանելու համար, ենթակաղապարներ հանելու համար (":=" օպերատոր), օգտագործեք անվանված հաստատուններ կաղապարում: Դասերում հնարավոր է հարմարեցնել համապատասխան վարքագիծը՝ օգտագործելով «__match__()» մեթոդը:

տվյալների դասակարգերից ներմուծման տվյալների դասակարգ

@dataclass
դասի կետ:
x:int
y:int

def whereis(point):
համընկնումի կետ.
case Point(0, 0):
տպել («Ծագում»)
դեպքի կետ (0, y):
տպել (f"Y={y}")
case Point(x, 0):
տպել (f"X={x}")
case Point():
տպել («Ուրիշ տեղ»)
case_:
տպել («Կետ չէ»)

համընկնումի կետ.
դեպք կետ (x, y) եթե x == y:
տպել (f"Y=X ժամը {x}")
դեպք կետ (x, y):
տպել (f"Ոչ անկյունագծով")

ԿԱՐՄԻՐ, ԿԱՆԱՉ, Կապույտ = 0, 1, 2
համապատասխան գույնը:
դեպք .ԿԱՐՄԻՐ:
տպել («Ես կարմիր եմ տեսնում»)
դեպք .ԿԱՆԱՉ:
տպել («Խոտը կանաչ է»)
գործ .BLU
E:
տպել («Ես զգում եմ բլյուզը :(»)

Ստուգման համար պատրաստվել է հավաքածու կարկատաններ փորձարարական հետ իրականացում առաջարկվում է հստակեցում, սակայն վերջնական տարբերակը դեռ կա քննարկվել է. Օրինակ, առաջարկվել է Նախնական արժեքի համար «case _:» արտահայտության փոխարեն օգտագործեք «else:» կամ «default:» հիմնաբառը, քանի որ «_»-ն այլ համատեքստերում օգտագործվում է որպես ժամանակավոր փոփոխական: Կասկածելի է նաև ներքին կազմակերպումը, որը հիմնված է նոր արտահայտությունների թարգմանության վրա բայթկոդի նման, որն օգտագործվում է «if ... elif ... else» կառուցվածքների համար, որը չի ապահովի ցանկալի կատարումը համեմատությունների շատ մեծ հավաքածուներ մշակելիս:

Source: opennet.ru

Добавить комментарий