Jeg prøver å lære mer om Python og hvordan det fungerer. Sitter akkurat nå og lager meg en "config-generator".
Jeg har ingenting imot å få tips eller gode råd til hvordan dette kan gjøres bedre Bare fint å lære.
Koden:
Så skal jeg vise dere hva som er i empty-configfile.txt:
Og så, defaultvalues.txt:
Jeg gjør oppmerksom på at dette ikke er fullstendig eller 100% korrekt bortsett fra python-koden som brukes. For eksempel er ikke empty-configfile.txt den samme som jeg bruker, det som er lagt ut her er for illustrasjon.
Som dere skjønner, så skal dette skriptet åpne "empty-configfile.txt" og erstatte det som står i f.eks. %(cfg_ipaddress)s med * som er satt i defaultvalues.txt.
Jeg har en tanke om at denne defaultvalues.txt-filen kun skal benyttes dersom brukeren ikke har lagt alle variablene i input. Jeg har ikke tatt med delen hvor jeg henter frem input fra brukeren i koden over, da det ikke egentlig er relevant.
Poenget er at hvis brukeren kun har lagt inn cfg_servername, men unnlater å legge inn cfg_ipaddress, så skal den settes til å være *. Det samme gjelder hvis ikke cfg_docroot er satt, da skal den settes til default /var/www/%(cfg_servername)s.
Med andre ord, brukeren kan valgfritt legge inn domenenavnet + variablene, eller kun domenenavnet og ingen av variablene (eller bare et par av dem) uten problemer.
Og hvis dere har gjettet at dette er en webserver-config, så har dere rett, det er det jeg leker med
Koden gjør nå dette:
1: Henter frem output fra opentemplate(), som altså er empty-configfile.txt
2: Leser hver linje av denne.
3: Legger inn hver linje i lista lin[] og erstatter samtidig verdien av %(cfg_variabel) med {cfg_variabel} som enten kommer fra brukerinput eller defaultvalues.txt. Til slutt legges lin[] inn i final_string sammen med et linjeskift per linje.
4: Dersom en nøkkel i empty-configfile.txt ikke finnes i defaultvalues.txt (eller input fra bruker), for eksempel nøkkelen foobar, så skjer det en KeyError. Da legges nøkkelen inn uansett, med verdi "not-set-because-not-found". (Eksperimentelt)
Jeg lager denne tråden fordi jeg ønsker å lære hvordan punkt nr. 4 kan gjøres omvendt. Altså, hvis nøkkelen finnes i defaultvalues.txt, men ikke brukes av empty-config.txt, så vil jeg vite om det. Utfordringen er at jeg ikke helt vet hvordan jeg kan hente frem hvilke nøkler som ligger inne i empty-config.txt. Det kunne jeg ha sammenlignet med defaultvalues.txt isåfall.
En annen ting jeg fremdeles tygger på, er at når den henter frem docroot=/var/www/%(cfg_domain)s, så vet jeg ikke helt om jeg skal kjøre enda en loop for å sette cfg_domain inne i docroot, eller om dere kanskje har andre forslag som er bedre.
På forhånd tusen takk for alle bidrag
Jeg har ingenting imot å få tips eller gode råd til hvordan dette kan gjøres bedre Bare fint å lære.
Koden:
Kode
import json def opentemplate(): templatefile = open('empty-configfile.txt', "r") templatelines = templatefile.read().splitlines() templatefile.close() return(templatelines) def getdefaultvalue(): file="defaultvalues.txt" with open(file) as f: arr = json.loads(f.read()) return arr def configure(): lin=[] for lines in opentemplate(): if lines: try: lin.append(lines % getdefaultvalue()) except KeyError as e: keyerr=e.args[0] lin.append(lines % {keyerr:"not-set-because-not-found"}) final_string = '\n'.join(lin) return(final_string)
Kode
servername=%(cfg_servername)s ipaddress=%(cfg_ipaddress)s documentroot=%(cfg_docroot)s foobar=%(foobar)s
Kode
{ "cfg_servername":"foobar.com", "cfg_ipaddress":"*", "cfg_docroot":"/var/www/%(cfg_servername)s" }
Som dere skjønner, så skal dette skriptet åpne "empty-configfile.txt" og erstatte det som står i f.eks. %(cfg_ipaddress)s med * som er satt i defaultvalues.txt.
Jeg har en tanke om at denne defaultvalues.txt-filen kun skal benyttes dersom brukeren ikke har lagt alle variablene i input. Jeg har ikke tatt med delen hvor jeg henter frem input fra brukeren i koden over, da det ikke egentlig er relevant.
Poenget er at hvis brukeren kun har lagt inn cfg_servername, men unnlater å legge inn cfg_ipaddress, så skal den settes til å være *. Det samme gjelder hvis ikke cfg_docroot er satt, da skal den settes til default /var/www/%(cfg_servername)s.
Med andre ord, brukeren kan valgfritt legge inn domenenavnet + variablene, eller kun domenenavnet og ingen av variablene (eller bare et par av dem) uten problemer.
Og hvis dere har gjettet at dette er en webserver-config, så har dere rett, det er det jeg leker med
Koden gjør nå dette:
1: Henter frem output fra opentemplate(), som altså er empty-configfile.txt
2: Leser hver linje av denne.
3: Legger inn hver linje i lista lin[] og erstatter samtidig verdien av %(cfg_variabel) med {cfg_variabel} som enten kommer fra brukerinput eller defaultvalues.txt. Til slutt legges lin[] inn i final_string sammen med et linjeskift per linje.
4: Dersom en nøkkel i empty-configfile.txt ikke finnes i defaultvalues.txt (eller input fra bruker), for eksempel nøkkelen foobar, så skjer det en KeyError. Da legges nøkkelen inn uansett, med verdi "not-set-because-not-found". (Eksperimentelt)
Jeg lager denne tråden fordi jeg ønsker å lære hvordan punkt nr. 4 kan gjøres omvendt. Altså, hvis nøkkelen finnes i defaultvalues.txt, men ikke brukes av empty-config.txt, så vil jeg vite om det. Utfordringen er at jeg ikke helt vet hvordan jeg kan hente frem hvilke nøkler som ligger inne i empty-config.txt. Det kunne jeg ha sammenlignet med defaultvalues.txt isåfall.
En annen ting jeg fremdeles tygger på, er at når den henter frem docroot=/var/www/%(cfg_domain)s, så vet jeg ikke helt om jeg skal kjøre enda en loop for å sette cfg_domain inne i docroot, eller om dere kanskje har andre forslag som er bedre.
På forhånd tusen takk for alle bidrag