2012-07-02 20 views
24

Python'da dinamik olarak nasıl işlev oluşturabilirim?Python: dinamik olarak çalışma zamanında işlev oluştur

Burada birkaç cevap gördüm, ancak en genel durumu açıklayan bir tane bulamadım.

düşünün:

def a(x): 
    return x + 1 

nasıl on-the-fly gibi bir fonksiyonu oluşturmak için? compile('...', 'name', 'exec') mu var? Ama sonra ne var? Bir kukla işlev oluşturmak ve kod nesnesini derleme adımından sonra değiştirmek mi istiyorsunuz?

Veya types.FunctionType kullanmalı mıyım? Nasıl?

Herşeyi özelleştirmek istiyorum: argüman sayısını içeriklerini, fonksiyon gövdesinin, sonuç, kod ...

+3

olası yinelenen [Python mümkün Gerçek dinamik ve anonim işlevlerin?] (Http://stackoverflow.com/questions/10303248/true-dynamic-and-anonymous-functions-possible-in-python) –

+0

Ben bir yinelenen sanmıyorum: 'dynf = FunctionType (derleme ('def f (x): x + 3', 'dyn.py', 'exec'), globals())' ve 'print dynf (1) 'TypeError: 'ile sonlanır: () hiçbir argüman almaz (1 verilen)'' –

+1

Sadece cevabın yanlış olabileceğinden, bunun yinelenen bir soru olmadığı anlamına gelmez. –

cevap

13

Kullanım exec:

>>> exec("""def a(x): 
... return x+1""") 
>>> a(2) 
3 
9

Eğer this izlediniz mi, Onun kullanmak nasıl söyler örnek types.FunctionType

Örnek:

import types 

def create_function(name, args): 
    def y(): pass 

    y_code = types.CodeType(args, 
          y.func_code.co_nlocals, 
          y.func_code.co_stacksize, 
          y.func_code.co_flags, 
          y.func_code.co_code, 
          y.func_code.co_consts, 
          y.func_code.co_names, 
          y.func_code.co_varnames, 
          y.func_code.co_filename, 
          name, 
          y.func_code.co_firstlineno, 
          y.func_code.co_lnotab) 

    return types.FunctionType(y_code, y.func_globals, name) 

myfunc = create_function('myfunc', 3) 

print repr(myfunc) 
print myfunc.func_name 
print myfunc.func_code.co_argcount 

myfunc(1,2,3,4) 
# TypeError: myfunc() takes exactly 3 arguments (4 given) 
+2

Evet, gördüm ve tam olarak peşindeyim. Ama fonksiyon gövdesini nasıl oluşturacağımı/değiştireceğimi ve değerlerini nasıl döndüreceğimi bilmiyorum ..? –

+1

Sadece denedim, çağrıyı sonunda doğru mb ile değiştirdiğinizde, segfault ... –

2

Bu yaklaşımdan ne haber? Bu örnekte

Bir değişkeni parametrizasyonunu birinci dereceden fonksiyonlar değilim (x -> ax + b) Bir sınıfta:

İşte u
class Fun: 
    def __init__(self, a,b): 
    self.a, self.b = a,b 

    def f(self, x): 
    return (x*self.a + self.b) 

u = Fun(2,3).f 

fonksiyonu olacaktır x-> 2x + 3 . dinamik bu parçayı denemek belli şablondan bir işlev oluşturmanız gerekiyorsa

7

:

fonksiyonu içinde
def create_a_function(*args, **kwargs): 

    def function_template(*args, **kwargs): 
     pass 

    return function_template 

my_new_function = create_a_function() 

create_a_function() Seçtiğin hangi şablonu, kontrol edebilir. İç işlev işlev_template şablon olarak işlev görür. İçerik oluşturucu işlevinin dönüş değeri bir işlevdir. Görevlendirildikten sonra, normal bir işlev olarak my_new_function'u kullanırsınız.

Genellikle, bu desen işlev dekoratörleri için kullanılır, ancak burada da kullanışlı olabilir.

0

Bunun için lambda'yı kullanabilirsiniz.

a=lambda x:x+1 
>>a(2) 
3 
İlgili konular