luser32 Skrevet 8. april 2006 Skrevet 8. april 2006 Har et script som tar et argument "command", som skal legges i en variabel og deretter kjøre en funskjon. Det er dette jeg har: arguments = sys.argv[2], sys.argv[3] name = arguments[0] #f.eks. Jens address = arguments[1] #f.eks. [email protected] command = sys.argv[1] #f.eks. Add command,(name, address) #Skal kjøre funskjonen Add('Jens', '[email protected]') Men det skjer ingenting når jeg kjører scriptet. Fins det noen måte å kjøre funskjoner ut ifra variabler, noe liknende call_user_func() i PHP?
zeitgeist Skrevet 8. april 2006 Skrevet 8. april 2006 Har et script som tar et argument "command", som skal legges i en variabel og deretter kjøre en funskjon.Det er dette jeg har: arguments = sys.argv[2], sys.argv[3] name = arguments[0] #f.eks. Jens address = arguments[1] #f.eks. [email protected] command = sys.argv[1] #f.eks. Add command,(name, address) #Skal kjøre funskjonen Add('Jens', '[email protected]') Men det skjer ingenting når jeg kjører scriptet. Fins det noen måte å kjøre funskjoner ut ifra variabler, noe liknende call_user_func() i PHP? 5887841[/snapback] Hvis jeg skjønner deg rett: - Du har et script som heter command.py - du skal kjøre det fra command-prompt - du skal kunne angi fra command-prompt hvilken funksjon du skal kjøre - i dette tilfelle Add() Det går, men det virker tungvint Hvorfor ikke bare lage en funksjon: def Add(name, email): # do something woth name and email og bruke f.eks -a som første argument i kallet: prompt> python command.py -a Jens [email protected] og i scriptet gjøre noe slikt: if sys.argv[1].lower() == '-a': # user wants to add Add(sys.argv[2], sys.argv[3])
luser32 Skrevet 8. april 2006 Forfatter Skrevet 8. april 2006 Nei, ikke helt riktig:) Programmet heter ikke command.py, men addresses.py. 'command' er et argument som skal byttes ut med et funksjonsnavn. Hvis jeg har funskjonene Del og Add, skal skal man kjøre enten: $ python addresses.py Add jens, [email protected] eller $ python addresses.py Del jens, [email protected] Dette skal kjøre henoldsvis funskjonene Add(name, address) og Del(name, address). Man kan selvfølgelig gjøre det ved å kjøre if slik som det her: if sys.argv[1] == 'Add': # user wants to add Add(sys.argv[2], sys.argv[3]) elif sys.argv[1] == 'Del': # user wants to delete Del(sys.argv[2], sys.argv[3]) Men har ikke lyst til det hvis det er en bedre måte, f.eks. som call_user_func() i PHP.
Gjest Slettet-8fx0y6VV Skrevet 8. april 2006 Skrevet 8. april 2006 (endret) En annen maate du kan gjore det paa er slik: import sys arguments = sys.argv[2], sys.argv[3] name = arguments[0] #f.eks. Jens address = arguments[1] #f.eks. [email protected] command = sys.argv[1] #f.eks. Add try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: print "Funksjonen finnest ikke" *Kose med Pythons superbe metaprogrammerings egenskaper* Endret 8. april 2006 av rapt0r
luser32 Skrevet 8. april 2006 Forfatter Skrevet 8. april 2006 En annen maate du kan gjore det paa er slik: import sys arguments = sys.argv[2], sys.argv[3] name = arguments[0] #f.eks. Jens address = arguments[1] #f.eks. [email protected] command = sys.argv[1] #f.eks. Add try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: print "Funksjonen finnest ikke" *Kose med Pythons superbe metaprogrammerings egenskaper* 5888452[/snapback] Der ja! Akkurat den jeg lette etter, Tusen takk
zeitgeist Skrevet 8. april 2006 Skrevet 8. april 2006 import sys arguments = sys.argv[2], sys.argv[3] name = arguments[0] #f.eks. Jens address = arguments[1] #f.eks. [email protected] command = sys.argv[1] #f.eks. Add try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: print "Funksjonen finnest ikke" Det er et morsomt "hack", men jeg ville aldri ha gjort det slik. Problemet er jo at man overlater kontrollen over interpreter fullstendig til bruker. En evil user kan kan gjøre mye skade via __import__ eller __builtin__ som scripet villig vil eksekvere. For å sikre scriptet mot slikt må man sjekke "kommandoene" og da virker vanlige argumenter som en ryddigere løsning.
Gjest Slettet-8fx0y6VV Skrevet 8. april 2006 Skrevet 8. april 2006 (endret) Liker du dette bedre? names = ['add', 'del'] if command in names: try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: pass eller kansje lik: names = {'add':Add, 'del':Del} try: names[command](foo, bar) except KeyError: print "Error" Endret 8. april 2006 av rapt0r
dayslepr Skrevet 8. april 2006 Skrevet 8. april 2006 (endret) løs det ved å lage en indirection; altså noe som gjør at man som programmerer må definere hvilke funksjoner man skal ha lov til å kalle .. legg disse funksjonene i en hash-tabell/liste som brukes til å slå opp i (off topic: jeg har gjordt noe lignende i SymbolicWeb .. der kalles funksjoner/metoder når brukeren klikker på knapper/linker i browseren ) edit: antar at det var det rapt0r gjorde nå? .. (jeg kan ikke Python) Endret 8. april 2006 av dayslepr
zeitgeist Skrevet 8. april 2006 Skrevet 8. april 2006 Liker du dette bedre? names = ['add', 'del'] if command in names: try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: pass eller kansje lik: names = {'add':Add, 'del':Del} try: names[command](foo, bar) except KeyError: print "Error" 5888674[/snapback] :-) ja. Men hva er så galt med klassiske argumenter, f.eks via optparse?
luser32 Skrevet 8. april 2006 Forfatter Skrevet 8. april 2006 Liker du dette bedre? names = ['add', 'del'] if command in names: try: # dette er det samme som Add('Jens', '[email protected]') globals()[command](name, address) except KeyError: pass eller kansje lik: names = {'add':Add, 'del':Del} try: names[command](foo, bar) except KeyError: print "Error" 5888674[/snapback] :-) ja. Men hva er så galt med klassiske argumenter, f.eks via optparse? 5888730[/snapback] Jo, det kan sikkert være det enkleste, i og med at jeg må gjøre forskjellige sjekker på hva brukeren skriver inn for at de forskjellige funskjonene skal virke som de skal. Så jeg tror kanskje jeg bytter om til det istedenfor.
Gjest Slettet-8fx0y6VV Skrevet 8. april 2006 Skrevet 8. april 2006 ....edit: antar at det var det rapt0r gjorde nå? .. (jeg kan ikke Python) 5888685[/snapback] Stemmer.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå