dabear Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 Hei, om jeg har funksjonen eller lambdaen 'foo', hvordan kan jeg da finne ut hvor mange argument den tar imot (dersom *args og **kwargs ikke er definert)? Lenke til kommentar
zeitgeist Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 Hei, om jeg har funksjonen eller lambdaen 'foo', hvordan kan jeg da finne ut hvor mange argument den tar imot (dersom *args og **kwargs ikke er definert)? 6573625[/snapback] Dette ser ut til å funke: def a(b, c): pass print a.func_code.co_argcount men det var bare noe jeg lekte frem i interpreteren. Lenke til kommentar
dabear Skrevet 28. juli 2006 Forfatter Del Skrevet 28. juli 2006 (endret) Takk, skal prøve det ut nå, men jeg fant en annen funksjon fra inspect-modulen som gjorde det samme import inspect inspct.getargspec(func_or_lambda)[0] evt bruke len på resultatet, men jeg kan jo bare loope over lista som returneres edit: hvorfor vil ikke ipython-interpretren vise meg info om a.func_code? Bruker a.func_code.co_varnames istedet jeg.. Endret 28. juli 2006 av dabear Lenke til kommentar
FraXinuS Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 Kan noen forklare hvordan det der *args og **kwargs funker? Lenke til kommentar
dabear Skrevet 28. juli 2006 Forfatter Del Skrevet 28. juli 2006 (endret) kvargs er det vel egentlig, men du kan forsåvidt kalle de hva du vil. *args plasserer du bak alle vanlige argumenter i en funksjon, mens **kvargs plasseres etter der igjen. *args er en beholder for alle argument som ikke er spesifisert i fnksjonen, menlikevell gitt til den. **kvargs funker likt men blir bare fyllt dersom argument er gitt til funksjonen i formen noe='noannet', den returnerer en dict. Begge funker nesten på samme måte som phpfunksjonen func_get_args def foo(arg1,arg2, *args): #args er en tuple med 'hey' og 'yo' foo('tralala', 'møø', 'hey', 'yo') # ---------------- def bar(arg1, **kvargs): #kvargs er {'mode': 'møø', 'action': 'shit'} bar('første param', mode='møø', action='shit') Begge kan brukes i samme funksjon, men da må **args står før **kvargs (igjen, du kan kalle de hva du vil) edit; hva vil være den beste måten å kalle en funksjon x ved hjelp av parameterene param = ['a', 'b']? Hittil har jeg jeg brukt x(*params), men er dette "pythonic" nok, eller skal jeg bruke en eller annen funksjon? Her er koden jeg laga,basert på denne koden i en annen tråd: #2 # not in use #from __future__ import division #from inspect import getargspec as getargs menu = [['Area of circle',lambda radius: int(radius)*2*3.14], ['Area of square',lambda sidelength:int(sidelength)**2], ['Area of rectangle',lambda height,width: int(height)*int(width)] ] try: while 1: print "\nSuperprogram..\nMenu:" print '\n'.join('%d: %s' % \ (menu.index(menuitem), menuitem[0]) for menuitem in menu) try: choice = int(raw_input('Please enter number for function, ctrl+c to quit: ')) index = menu[choice] except ValueError, IndexError: print 'No such option %s, try again' %(choice) continue answers = [] try: for param in index[1].func_code.co_varnames: answers.append(float(raw_input('Please specify the %s:' %param))) except ValueError: #print 'Invalid choice; try again' print "Starting from the beginning, sigh, why didn't you specify a mathematical value?" continue print index[0], ':', index[1](*answers) except KeyboardInterrupt: print 'Have a nice day!' Endret 28. juli 2006 av dabear Lenke til kommentar
FraXinuS Skrevet 28. juli 2006 Del Skrevet 28. juli 2006 ok, da tror jeg at jeg forstår det. Lenke til kommentar
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å