SORU
10 AĞUSTOS 2009, PAZARTESİ


Python fonksiyon turşu için kolay bir yol (veya başka bir kod seri hale getirmek) var mı?

Bir transfer ağ bağlantısı (asyncore kullanarak) üzerinden bir işlevi aktarmak için çalışıyorum. Kolay bir şekilde python bir işlev (bu durumda, en azından, yan olacak.) bu şekilde aktarım için seri hale getirmek için yok mu?

İdeal fonksiyonlar için benzer bir çift istiyorum:

def transmit(func):
    obj = pickle.dumps(func)
    [send obj across the network]

def receive():
    [receive obj from the network]
    func = pickle.loads(s)
    func()

CEVAP
10 AĞUSTOS 2009, PAZARTESİ


Fonksiyon koduna serialise ve arayanın üzerine yeniden yükleyin. marshal modül daha sonra bir fonksiyonu olarak yeniden birleştirilen olabilir hangi kodu nesneler, serialise için kullanılabilir. yani:

import marshal
def foo(x): return x*x
code_string = marshal.dumps(foo.func_code)

Uzaktan sürecinde (code_string aktardıktan sonra):

import marshal, types

code = marshal.loads(code_string)
func = types.FunctionType(code, globals(), "some_func_name")

func(10)  # gives 100

Birkaç uyarılar:

  • Mareşal biçimi (bu konuda herhangi bir python bayt) büyük python sürümleri arasında uyumlu olmayabilir.

  • Cpython uygulanması için çalışır sadece.

  • İşlevi almak için gereken genel değerler (ithal modülleri, vb diğer fonksiyonlar da dahil olmak üzere) başvuruyorsa, bu da serialise, ya da uzak tarafında onları yeniden gerekir. Benim örnek sadece uzaktan işlemin genel ad verir.

  • Muhtemelen biraz daha fazla karmaşık durumlarda destek, kilitler ya da jeneratör fonksiyonları gibi yapmanız gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • dougownsall

    dougownsall

    7 EKİM 2007
  • GoldgenieOfficial

    GoldgenieOff

    23 Temmuz 2009