Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse
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

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? :p Bruker a.func_code.co_varnames istedet jeg..

Endret av dabear
Lenke til kommentar

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