2012-08-16 17 views
11

Eski kodumu yeniden çiziyorum ve işlev adlarını pep8 ile uyumlu olarak değiştirmek istiyorum. Ancak, sistemin eski bölümleriyle geriye dönük uyumluluk sağlamak istiyorum (projenin tam bir yeniden yapılandırılması imkansızdır çünkü işlev adları API'nın bir parçasıdır ve bazı kullanıcılar eski istemci kodunu kullanır).Geriye dönük uyumluluğun korunmasıyla işlevlerin yeniden adlandırılması

Basit bir örnek, eski kod:

def helloFunc(name): 
    print 'hello %s' % name 

Yeni:

def hello_func(name): 
    print 'hello %s' % name 

Ancak her iki fonksiyonlar çalışması gerekir:

>>hello_func('Alex') 
>>'hello Alex' 
>>helloFunc('Alf') 
>>'hello Alf' 

ben düşünüyorum:

def helloFunc(name): 
    hello_func(name) 

, ama hoşuma gitmiyor (projede yaklaşık 50 fonksiyon var ve dağınık görünecek).

Bunu yapmanın en iyi yolu nedir (çoğaltmanın hariç tutulması hariç)? Bazı evrensel dekoratörlerin oluşturulması mümkün mü?

Teşekkürler.

cevap

7

Ben şimdilik düşünüyorum, kolay şey sadece eski işlev nesnesine yeni bir başvuru oluşturmaktır:

Tabii
def helloFunc(): 
    pass 

hello_func = helloFunc 

, muhtemelen daha biraz daha temiz olurdu eğer hello_func gerçek işlevinin adını değiştirdi ve daha sonra da diğer adı oluşturuldu: Bu hala sizin modül isim gereksiz yere Clutterlar çünkü biraz dağınık

helloFunc = hello_func 

. Bunu aşmak için, bu "takma adlar" sağlayan bir alt modüle sahip olabilirsiniz. Ardından, kullanıcılarınız için import module'u import module.submodule as module olarak değiştirmek kadar basit olur, ancak modül ad alanınızı karıştırmazsınız.

Muhtemelen bile bu automagicallylar (denenmemiş) böyle bir şey yapmak inspect kullanabilirsiniz:

import inspect 
import re 
def underscore_to_camel(modinput,modadd): 
    """ 
     Find all functions in modinput and add them to modadd. 
     In modadd, all the functions will be converted from name_with_underscore 
     to camelCase 
    """ 
    functions = inspect.getmembers(modinput,inspect.isfunction) 
    for f in functions: 
     camel_name = re.sub(r'_.',lambda x: x.group()[1].upper(),f.__name__) 
     setattr(modadd,camel_name,f) 
+0

Ah, bunu nasıl unutabilirim! Teşekkürler! – vlad

+1

@vlad - Ben otomatik (hiçbir olduğu gibi ama gerçekten lambda' fonksiyonları 'çalışmaz functionWithUnderscores'' olarak modadd' 'üzerine' modinput' 'modülünden function_with_underscores' katacak düşünüyorum bir işlevi ekledik denetlenebilir isim (AFAIK) – mgilson

4

Sen, modülün ad alanında başka bir ad için işlev nesnesini bağlayabilir örn:

def funcOld(a): 
    return a 

func_new = funcOld 
5

Diğer cevaplar kesinlikle doğru olsa da, işlevi yeni adıyla yeniden adlandırmak ve uyarı veren eski bir tane oluşturmak yararlı olabilir:

def func_new(a): 
    do_stuff() 

def funcOld(a): 
    import warnings 
    warnings.warn("funcOld should not be called any longer.") 
    return func_new(a) 
2

Sorunuz, kullanımdan kaldırılma veya benzeri gibi çok fazla ses çıkardıkça, daha temiz kodlar için dekoratörlerin kullanımını şiddetle tavsiye ediyorum. Aslında, başka bir iş parçacığında bir kişi zaten created this for you var.

İlgili konular