Gå til innhold

Runtime funsjon - importere alle globale objecter


Anbefalte innlegg

Har en funksjon for å beregne tiden det tar får en gitt handling å utføres.

import time

def runtime(execute):
global time

start = time.time()
exec(execute)
stop = time.time()

t = stop - start
#return (time.seconds*1000)+time.microseconds
return t*1000

 

Problemet er oppstår når jeg prøver å kjøre funksjonen med en execute-string som inneholder objecter som ikke finnes inni funksjonen.

 

>>Poll.objects.all()

Funksjon funker helt fint og spytter ut output

 

>>import runtime

>>runtime.runtime( "Poll.objects.all()" )

Traceback (most recent call last):

  File "<console>", line 1, in <module>

  File "C:\Python25\runtime.py", line 7, in runtime

    exec(execute)

  File "<string>", line 1, in <module>

NameError: name 'Poll' is not defined

 

Siden det ikke er gitt at det er Poll-objectet som skal brukes er det umulig å bruke global for å importere objectet til funksjonen. Er det derfor noen som vet om en måte jeg kan omgå dette problemet på?

Lenke til kommentar
Videoannonse
Annonse

I stedet for å bruke en string for å representere det du skal kjøre bør du sende noe som er kallbart (typisk en funksjon). Når man først er i støtet kan man også tillate argumenter:

def runtime(func, *args):
   if not callable(func):
       raise TypeError('func is not callable')
   # kall func med argumenter slik
   func(*args)

def test_func(a, b, c):
   print (a + b + c)

Her tar altså runtime() et kallbart objekt og et vilkårlig antall argumenter som er argumentene til det den skal kalle.

 

>>> runtime(test_func, 1, 2, 3)
6

Mer pythonsk, tryggere, penere og bedre :) IMHO.

Endret av steingrim
Lenke til kommentar

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