Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Namedtuples a jejich použití jako parametrů v print.format()

Aktivity
Avatar
Petr Vavřinec:4.9.2020 12:30

Ahoj kamarádi.
Mám šablony textů s parametry pro různé příležitosti a rád bych do funkce print.format() přiřazoval velmi jednoduše jen tu kterou konkrétní pojmenovanou matici, abych se nemusel starat o to, že parametry/položky v té pojmenované matici se jmenují stejně, jako položky té pojmenované matice.
Jenže netuším, jak "namapovat" tu pojmenovanou matici na parametry toho print.format(), aniž bych tam nemusel dělat nějaké "složité" přiřazování v parametrech toho print.format().
A zároveň se nechci starat o počet těch předaných parametrů, neboli kolik jich ta šablona ve finále opravdu potřebuje. A nezáleželo na pořadí, v jakém v té šabloně použiju ty parametry.

ČIli bych chtěl "něco" takového (pseudoPython):

import collections as clc

Parametry = clc.namedtuples("Parametry","jmeno_hotelu odlet destinace") #tady se jmenují ty položky česky
prvni = Parametry("Hvězda","1.9.2020","Tatry")
druhy=Parametry("Kolotoč","2.9.2020","Beskydy")

Sablona1 = "Jeďte od {date_from} do krásné destinace {destination} a hotelu {hotel}." #v šablonách se ale ty parametry jmenují anglicky

Sablona2 = "Do destinace {destination} od {date_from}!" #pořadí je jiné a zároveň tam nejsou všechny parametry

print(Sablona1.format(prvni)) #vím, že v té závorce musí být něco jiného, nějaké mapování na ty jednotlivé parametry, ale to právě nevím jak
print(Sablona1.format(druhy))
print(Sablona2.format(prvni))
print(Sablona2.format(druhy))

#Output:
Jeďte od 1.9.2020 do krásné destinace Tatry a hotelu Hvězda.
Jeďte od 2.9.2020 do krásné destinace Beskydy a hotelu Kolotoč.
Do destinace Tatry od 1.9.2020!
Do destinace Beskydy od 2.9.2020!

Zkusil jsem: Moje pokusy jsou zde: https://pastebin.com/eqC3242z

Output toho mého kódu je:

Hotel ItaWella za cenu 10000Kč s odletem 1.9.2020.
Hotel FraResort za cenu 20000Kč s odletem 2.9.2020.
Hotel BelBells za cenu 30000Kč s odletem 3.9.2020.
Odleťte už 1.9.2020 do hotelu ItaWella za úřasnou cenu 10000Kč.
Odleťte už 2.9.2020 do hotelu FraResort za úřasnou cenu 20000Kč.
Odleťte už 3.9.2020 do hotelu BelBells za úřasnou cenu 30000Kč.
Zaplaťte jen 10000Kč a navštivte ItaWella od 1.9.2020.
Zaplaťte jen 20000Kč a navštivte FraResort od 2.9.2020.
Zaplaťte jen 30000Kč a navštivte BelBells od 3.9.2020.
Za 10000Kč od 1.9.2020 do 1* hotelu ItaWella do prosluněné Itálie.
Za 20000Kč od 2.9.2020 do 2* hotelu FraResort do prosluněné Francie.
Za 30000Kč od 3.9.2020 do 3* hotelu BelBells do prosluněné Belgie.

Ale to jen proto, že tam prostě dělám to složité přiřazování v té funkci print.formát()

Chci docílit: Technicky vzato to nemusí být pojmenované matice. Mám prostě funkci, která scrapuje moje stránky s termíny zájezdů (třeba https://www.travelasap.cz/…a/212924214d ) a tam odsud si vyparsuje všechny potřebné parametry toho daného zájezdu a vrátí je do proměnné, která tu funkci zavolala. Čili to může být asi i normální matice, nebo objekt (ale s OOP jsem zatím nekoketoval).
Pak mám tedy spoustu a spoustu (řádově stovky) šablon textů, které jsou připravené dopředu. Mají v sobě ve složených závorkách ty parametry. A já potřebuju vytisknout konkrétní šablonu pro konkrétní účel, aby se doplnily ty správné parametry na správná místa, aniž bych se musel zajímat, kolik té funkci print.format() předám těch parametrů (prostě je předám všechny) a v jakém pořadí.

Chci se dostat do stavu, že mohu počet získaných parametrů v té scrapovací funkci libovolně zvyšovat v budoucnu, tak jak se mi podaří vyparsovat další a další "užitečné" informace.
V současném stavu bych ale musel při každém nově získaném parametru v té parsovací funkci upravit i to přiřazování v závorce u print.format(), což se mi zdá pracné. Ono totiž bude dost pracné potom přidávat ty nové parametry do těch šablon.
Když třeba časem vydoluju nový parametr "vzdálenost od moře", musel bych ho přiřadit na výstupu té funkce už do správně pojmenované proměnné, která bude mít stejný název jako parametr, který dodatečně přidám do některých (a jen některých) vhodných šablon.

Děkuji za nápad.

 
Odpovědět
4.9.2020 12:30
Avatar
Jiří Havelka:4.9.2020 13:11

Na první pohled se mi zdá, že se snažíš vymaslet kolo.Jednoduchý šablonovací systém je již součástí pythonu https://docs.python.org/…/string.html#…. Budeš sice muset změnit syntaxy těch tvých šablon, ale to by mělo jít udělat automatizoovamě. Pak budeš moci šabloně předhodit typ dictionry máš vyhráno.

 
Nahoru Odpovědět
4.9.2020 13:11
Avatar
Odpovídá na Jiří Havelka
Petr Vavřinec:6.9.2020 18:59

Děkuji moc, Jiří Havelka Jiří Havelka . Já tedy mám celkem problém číst tu originální Python dokumentaci (nějak mi ten jejich styl nesedí a ztrácím se v tom), každopádně ten šablonovací systém je přesně to, co jsem myslel. Úžasné. Dodatečně si mohu do toho dictu doplnit jakýkoli parametr, pak o něj mohu obohatit jen ty šablony, do kterých se mi hodí a nemusím se vůbec starat, co té funkci string.substitute() v tom dictu podhodím. Když je tam toho víc, než šablona potřebuje, nevadí mu to, když je tam toho míň (přání v šabloně předběhlo parsování parametru), tak to zařve a já ten parametr doplním... Za mě veliká paráda.
Každopádně, když už jsem narazil na ten problém, že mám problém s funkcemi .format(), map() a zip(), tak je aspoň dostuduju. Pořád by mě totiž zajímalo, jak "namapuju" něco takovéhleho:

from collections import namedtuple
Cesky =  namedtuple("Cesky","prvni druhy treti")
Anglicky = namedtuple("Anglicky", "first second third")
jmena = Cesky("Adam", "Bohdan", "Cyril")
names = jmena.udelej_ted_neco_ale_ja_nevim_co()
print(names)
#Output: Anglicky(first="Adam", second="Bohdan", third="Cyril")

Petr V.

 
Nahoru Odpovědět
6.9.2020 18:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.