Gå til innhold

kjøre forskjellige funskjoner ut fra variabel?


Anbefalte innlegg

Skrevet

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?

Videoannonse
Annonse
Skrevet
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])

Skrevet

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 (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* :love:

Endret av rapt0r
Skrevet
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*  :love:

5888452[/snapback]

 

Der ja!:)

 

Akkurat den jeg lette etter, Tusen takk :thumbup:

Skrevet
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 (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 av rapt0r
Skrevet (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 av dayslepr
Skrevet
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?

Skrevet
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
....

edit: antar at det var det rapt0r gjorde nå? :)  .. (jeg kan ikke Python)

5888685[/snapback]

 

Stemmer.

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...