Hvordan håndheve Unicode argumenter for metoder?

stemmer
0

Jeg har en modell klasse med gettermateriale og setter-metoder, og de sporadiske statiske metoder. Jeg ønsker å håndheve bruken av Unicode-strenger som argumenter for spesifikke metoder og bruk dekoratører var den første tanken jeg hadde. Nå har jeg noe sånt som dette:

import types

class require_unicode(object):

    def __init__(self, function):
        self.f = function

    def __call__(self, string):
        if not isinstance(string, types.UnicodeType):
            raise ValueError('String is not unicode')
        return self.f(string)

class Foo(object):

    something = 'bar'

    @staticmethod
    @require_unicode
    def do_another(self, string):
        return ' '.join(['baz', string])

    @require_unicode
    def set_something(self, string):
        self.something = string

foo = Foo()
foo.set_something('ValueError is raised')
foo.set_something(u'argument count error')
foo.do_another('ValueError is raised')
foo.do_another(u'argument count error')

I koden ovenfor metodekallet inne dekoratør __call__svikter på grunn av feil argument count (fordi mangler 'foo' objekt ref?). Før du gjør noe dumt jeg ville spørre dere. Hvordan dette skal gjøres?

Publisert på 04/11/2009 klokken 16:51
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Jeg tror problemet ditt er med @staticmethod dekoratør, ikke med require_unicode dekoratør. Staticmethods, i motsetning classmethods ikke får referansen til klassen som første argument, så ditt argument signatur er galt.

Du må enten endre do_another å være en @classmethod eller fjerne selffra argumentene.

EDIT: og, tankene, - @ classmethod-dekorerte metoder motta den klasse som den første argumentet, mens instansmetoder motta referansen til forekomst av klassen (selv). Så det er en god idé å nevne det første argumentet til en classmethod "CLS" eller noe, ikke "self" slik at den ikke forvirre noen.

Svarte 04/11/2009 kl. 17:04
kilden bruker

stemmer
0

Jeg vil tro at dette var unpythonic - du bør aldri sjekke hvilken type dine argumenter, men i stedet sjekke at de har de nødvendige metoder og attributter. Den enkleste måten å gjøre dette på er ved å anta at de er der og få et unntak ellers, men jeg antar du kan gjøre getattrogså. Bare ikke sjekke den type ting.

Svarte 04/11/2009 kl. 17:22
kilden bruker

stemmer
0

Et annet alternativ er å bruke påstander. Det avhenger av om passerer et ikke-Unicode type i dine metoder bør betraktes som en programmeringsfeil som bør være tydelig under utvikling.

import types
class Foo:
    def set_something(self, string):
        assert isinstance(string, types.UnicodeType), 'String is not unicode'
        self.something = string

Dette vil heve et AssertionErrorunntak når stringer ikke av typen unicode, men bare når Python interpretter kjøres i "deubg" modus. Hvis du kjører Python med -Oalternativet, blir hevde effektivt ignorert av interpretter.

Svarte 05/11/2009 kl. 00:28
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more