2010-11-17 16 views
9

Tüm işlevlerin (yerleşik veya kullanıcı tanımlı) aynı sınıfa ait olduğunu varsayıyorum, ancak bu sınıf varsayılan olarak herhangi bir değişkene bağlı görünmüyor mu?python 3: bir nesnenin bir işlev olup olmadığını nasıl kontrol edilir?

Nesnenin bir işlev olduğunu nasıl kontrol edebilirim? Düzgün görünmüyor

def is_function(x): 
    def tmp() 
    pass 
    return type(x) is type(tmp) 

ve bunu mükemmel doğru değil hatta% 100 eminim: Bunu yapabilirim

sanırım.

+2

da bir fonksiyon olarak adlandırılabilir bir __call__ yöntemiyle nesneleri vardır: çağrılabilir olarak

isinstance(fn, collections.Callable) 

bir soyut temel sınıf olup, bu eşdeğerdir. – SiggyF

+1

Tüm sınıflar bir işlev olarak çağrılabilir. – PaulMcG

cevap

14

:

callable(fn) 

yılında python3 :

hasattr(fn, '__call__') 
+3

“callable” işlevi ilk olarak Python 3.0'da kaldırıldı ve daha sonra Python 3.2'ye geri getirildi. Böylece, çeviricinin yeni bir sürümü kullanılıyorsa, bunu Python 3'ü de kullanabilirsiniz. Daha fazla bilgi için http://docs.python.org/3/library/functions.html?highlight=callable#callable adresine bakın. –

1

Sen yapabilirsiniz:

def is_function(x): 
    import types 
    return isinstance(x, types.FunctionType) \ 
     or isinstance(x, types.BuiltinFunctionType) 
+0

ama aynı sınıfta olup olmadığını da kontrol ediyor mu? –

+0

@Version, "aynı sınıftan geliyorsa" ile ne demek istiyorsun? –

+0

', türündeki nesnelere aittir, yikes. Açık tipte yazımlar kullanmanız gerekiyorsa, en azından 'isinstance()' işlevini kullanın ve tercihen 'inceleme' modülünden bunun yerine bunu yapmasını isteyin. –

4

nasıl bir nesne bir işlev olup olmadığını kontrol edebilirsiniz?

callables

için
hasattr(object, '__call__') 

kontrol etme gibi bu aynı şey değil mi ve de piton 2.x python2 içinde

callable(object) == True 
+1

, aynı zamanda sınıflar için de geçerlidir, ancak +1 yine de, – kriss

-2
try: 
    magicVariable() 
except TypeError as e: 
    print('was no function') 
+3

-1 yazarak ördek mantığının daha fazla olduğu görülüyorsa, bunu test etmek için işlevi yürütmemelisiniz. –

+4

Kodum, * test * olarak belirtilmemiş. Bir değişkeniniz olduğunda, bir işlev olup olmadığını kontrol etmenin tek nedeni, onu kullanmak istediğiniz için olmasıdır. Bunu önceden kontrol etmek için zaman harcamak yerine, onu sadece bir işlev olarak kullanmalı ve istisnayı kullanmalısınız. – poke

+1

i + 1'ledim çünkü genel durumda haklı olduğunuzu düşünüyorum, ancak birisinin işlevini yerine getirip getirmediğini bilmek isteyen bir kişi var. Meta sınıflar ve sınıf dekoratörler akla geliyor. – aaronasterling

İlgili konular