Python

2011-03-22 17 views
7

'da değişken adına göre bir işlev yürütme Yapmam gereken çok sayıda farklı dosya üzerinde işlem yapmak ve dosyalardaki meta verileri getirmeye çalışmaktır.Python

Büyük bir ... elif ... yapabilirim ve her uzantı için test yapabilirim, ancak uzantıyı bir değişkende saklamanın çok daha kolay olacağını, bu ada sahip bir işlev olup olmadığını kontrol etmenin ve yürütmenin çok daha kolay olacağını düşünüyorum. o.

Bu başka stackoverflow iş parçacığı alınan benim şimdiki çözümdür: hatası "bulunamadı fonksiyonu" temel fonksiyonu, bu şekilde kayıtlı bir AttributeError yükseltirse : Bir bu sorun var

try: 
    getattr(modulename, funcname)(arg) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 

. Bütün fonksiyonlara blokların dışında ... deneyin ekleyebilir, ancak çok hoş ya olmaz ... gibi daha bir şey ne aradığım olduğu

:

if function_exists(fun): 
    execute_function(fun, arg) 

mı orada Bunu yapmanın açık yolu?

fun = getattr(modulename, funcname, None) 

if fun is None: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else 
    fun(arg) 

cevap

22

Sen yapabilirsin: gettattr function nitelik yoksa o kullanabilir böylece varsayılan bir değer, geri dönmek için isteğe bağlı üçüncü argüman vardır

+1

ben fonk (arg) 'sarmak:

bir değişken içinde bu kullanmak için çağrılabilir. – geoffspear

+0

@Wooble: iyi bir öneri ya da o da yapabilir: 'if func ve callable (func):' – mouad

+0

@Carpetsmoker: bu yardımcı olur :) – mouad

3

:-)

Teşekkür

func = getattr(modulename, funcname, None): 
if func: 
    func(arg) 

Ya da belki daha iyi:

try: 
    func = getattr(modulename, funcname) 
except AttributeError: 
    print 'function not found "%s" (%s)' % (funcname, arg) 
else: 
    func(arg) 
0

Mouad'ın dediği gibi, callable(function) bir işlevi çağırabilir.

Bunu kullanarak bir değişkenin içinden bir işlevi çağırmak için kullanabilir:

callable(SAVE()) 

Bu arg olarak belirtilir işlevini çağırır. bu değil func` modül bir öznitelik `vardır durumunda` ve yakalamak TypeError: Bir `denemek içinde`

Save = callable(SAVE())