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

  • RomanAtwood

    RomanAtwood

    18 Kasım 2009
  • talkandroid

    talkandroid

    27 Mayıs 2010
  • TechShowsYou

    TechShowsYou

    3 Mart 2011