복붙노트

[PYTHON] 파이썬 함수를 피클 링하는 쉬운 방법이 있습니까? 아니면 코드를 직렬화할까요?

PYTHON

파이썬 함수를 피클 링하는 쉬운 방법이 있습니까? 아니면 코드를 직렬화할까요?

네트워크 연결 (asyncore 사용)을 통해 함수를 전송하려고합니다. 파이썬 함수를 serialize하는 쉬운 방법이 있나요? (이 경우에는 최소한 영향을 미치지 않습니다).

필자는 다음과 유사한 함수 쌍을 갖고 싶어합니다.

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

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

해결법

  1. ==============================

    1.함수 바이트 코드를 직렬화 한 다음 호출자에서 다시 구성 할 수 있습니다. 마샬 (marshal) 모듈은 코드 객체를 직렬화하는 데 사용할 수 있습니다. 그런 다음 코드 객체를 함수로 다시 어셈블 할 수 있습니다. 즉 :

    함수 바이트 코드를 직렬화 한 다음 호출자에서 다시 구성 할 수 있습니다. 마샬 (marshal) 모듈은 코드 객체를 직렬화하는 데 사용할 수 있습니다. 그런 다음 코드 객체를 함수로 다시 어셈블 할 수 있습니다. 즉 :

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

    그런 다음 원격 프로세스 (code_string 전송 후) :

    import marshal, types
    
    code = marshal.loads(code_string)
    func = types.FunctionType(code, globals(), "some_func_name")
    
    func(10)  # gives 100
    

    몇 가지주의 사항 :

  2. ==============================

    2.함수를 포함하여 더 다양한 유형을 지원하기 위해 Python의 피클 라이브러리를 확장하는 Dill을 확인하십시오.

    함수를 포함하여 더 다양한 유형을 지원하기 위해 Python의 피클 라이브러리를 확장하는 Dill을 확인하십시오.

    >>> import dill as pickle
    >>> def f(x): return x + 1
    ...
    >>> g = pickle.dumps(f)
    >>> f(1)
    2
    >>> pickle.loads(g)(1)
    2
    

    또한 함수의 클로저에있는 객체에 대한 참조를 지원합니다.

    >>> def plusTwo(x): return f(f(x))
    ...
    >>> pickle.loads(pickle.dumps(plusTwo))(1)
    3
    
  3. ==============================

    3.파이로가 당신을 위해 이것을 할 수 있습니다.

    파이로가 당신을 위해 이것을 할 수 있습니다.

  4. ==============================

    4.가장 간단한 방법은 아마도 inspect.getsource (object) (inspect 모듈 참조)입니다.이 메소드는 함수 또는 메소드의 소스 코드가있는 String을 반환합니다.

    가장 간단한 방법은 아마도 inspect.getsource (object) (inspect 모듈 참조)입니다.이 메소드는 함수 또는 메소드의 소스 코드가있는 String을 반환합니다.

  5. ==============================

    5.그것은 모두 런타임에서 함수를 생성하는지 여부에 달려 있습니다.

    그것은 모두 런타임에서 함수를 생성하는지 여부에 달려 있습니다.

    그렇게하면 - inspect.getsource (object)는 .py 파일에서 객체의 소스를 가져 오기 때문에 동적으로 생성 된 함수에서는 작동하지 않으므로 실행 전에 정의 된 함수 만 소스로 검색 할 수 있습니다.

    그리고 어쨌든 함수가 파일에 배치되면, 수신기에 액세스 권한을 부여하지 말고 모듈과 함수 이름 만 전달하십시오.

    내가 생각할 수있는 동적으로 생성 된 함수에 대한 유일한 해결책은 전송 전에 문자열로 함수를 만들고 소스를 전송 한 다음 수신 측에서 eval ()하는 것입니다.

    편집 : 마샬 솔루션은 꽤 똑똑해 보이고, 당신이 뭔가 다른 것을 직렬화 할 수 있다는 것을 몰랐다.

  6. ==============================

    6.클라우드 패키지 (pip install cloud)는 종속성을 포함하여 임의 코드를 피클 할 수 있습니다. https://stackoverflow.com/a/16891169/1264797을 참조하십시오.

    클라우드 패키지 (pip install cloud)는 종속성을 포함하여 임의 코드를 피클 할 수 있습니다. https://stackoverflow.com/a/16891169/1264797을 참조하십시오.

  7. ==============================

    7.이 모듈에 사용되는 기본 기능은 쿼리를 다루고 와이어를 통해 최상의 압축을 얻습니다. 유용한 소스 코드보기 :

    이 모듈에 사용되는 기본 기능은 쿼리를 다루고 와이어를 통해 최상의 압축을 얻습니다. 유용한 소스 코드보기 :

    y_serial.py module ::웨어 하우스 Python 객체와 SQLite

    "직렬화 + 지속성 :: 몇 줄의 코드로 Python 객체를 압축하고 주석을 달고 SQL을 사용하지 않고 키워드로 시간순으로 검색합니다. 스키마가없는 데이터를 저장하는 데 가장 유용한"표준 "모듈입니다."

    http://yserial.sourceforge.net

  8. ==============================

    8.

    code_string = '''
    def foo(x):
        return x * 2
    def bar(x):
        return x ** 2
    '''
    
    obj = pickle.dumps(code_string)
    
    

    지금

    exec(pickle.loads(obj))
    
    foo(1)
    > 2
    bar(3)
    > 9
    
  9. from https://stackoverflow.com/questions/1253528/is-there-an-easy-way-to-pickle-a-python-function-or-otherwise-serialize-its-cod by cc-by-sa and MIT license