accepts decorator

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • urielka

    #1

    accepts decorator

    i want to make a decorator that make a function accept only types,if
    the types are wrong but the number of types is equal to arguments try
    to convert them to the type.

    for example:

    @Accept(int,int )
    def Sum(a,b):
    return a+b

    print Sum("2",2.0)

    this should print 4,coz the decorator sees that there is the same
    amount of arguments in Accept and Sum,then it will try to cast them to
    the types(a to int and also b to int),then he will send them to the
    normal function so Sum will get a=2,b=2 instead of a="2"(string)
    b=2.0(float).
    i made this but it doesn`t work:
    def Accept(*types):
    def check_accepts(f ):
    assert len(types) == f.func_code.co_ argcount-1,"Not
    Enougth/Too much Types"
    Types=types
    def new_f(*args, **kwds):
    newArgs=[]
    for (a, t) in zip(kwds.values (), Types):
    try:
    newArgs.append( t(a))
    except:
    raise Exception("Conv ertion of %s to type %s
    failed" %(a,t))
    nargs=tuple(new Args)
    return f(*nargs, **kwds)
    new_f.func_name = f.func_name
    return new_f
    return check_accepts

    it doesn`t work when i decorate a instance method.
    i get in *args the instance and in **kwds the arguments,but if it is
    just a function not a instance method i get in *args the arguments and
    in **kwds a empty dict.

    can someone also explain me what is * and ** ,and how they are called.

    Thanks,
    -Uriel Katz

  • urielka

    #2
    Re: accepts decorator

    i think i got what the * and ** mean.
    *args mean arguments that are assigned by position(that is why *arg is
    a tuple)
    **kwds mean arguments that are assigned using equals a=2,b=3 (that is
    why **kwds i a dict)
    but why self is in *args and other thing goes to **kwds? even if not
    assigned using equals

    Comment

    • Gabriel Genellina

      #3
      Re: accepts decorator

      At Monday 25/9/2006 21:58, urielka wrote:
      >i think i got what the * and ** mean.
      >*args mean arguments that are assigned by position(that is why *arg is
      >a tuple)
      >**kwds mean arguments that are assigned using equals a=2,b=3 (that is
      >why **kwds i a dict)
      >but why self is in *args and other thing goes to **kwds? even if not
      >assigned using equals
      For these elemental things you should start by reading the Python
      tutorial included with the documentation - it's easy.
      And for decorators, this is a good text
      http://www.phyast.pitt.edu/~micheles...mentation.html which
      supplements the Python docs.



      Gabriel Genellina
      Softlab SRL





      _______________ _______________ _______________ _____
      Preguntá. Respondé. Descubrí.
      Todo lo que querías saber, y lo que ni imaginabas,
      está en Yahoo! Respuestas (Beta).
      ¡Probalo ya!


      Comment

      • urielka

        #4
        Re: accepts decorator

        hehe i saw that,that is what made my understand it.
        the decorator now works.
        let say i have a function decorated with two decorators:

        @Accept(int,int )
        @OtherDecorator
        def myfunc(a,b):
        pass

        how can i make the two decorators into one(note:one get parameters and
        the other doesn`t)

        Comment

        Working...