blob: c4295b444274da98f79e66710c0681a0b55cb43e [file] [view]
---
title: Functions, Classes, and Methods
sidebar_position: 9
id: functions-classes-methods
license: |
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
---
Python native mode serializes Python-specific callable and type values that are outside the xlang
type system. Use `strict=False` only for trusted payloads and apply a deserialization policy when
the accepted dynamic surface must be restricted.
## Serialize Global Functions
Capture and serialize functions defined at module level. Fory deserializes and returns the same
function object:
```python
import pyfory
fory = pyfory.Fory(xlang=False, ref=True, strict=False)
def my_global_function(x):
return 10 * x
data = fory.dumps(my_global_function)
print(fory.loads(data)(10)) # 100
```
## Serialize Local Functions/Lambdas
Serialize functions with closures and lambda expressions. Fory captures the closure variables
automatically:
```python
import pyfory
fory = pyfory.Fory(xlang=False, ref=True, strict=False)
# Local functions with closures
def my_function():
local_var = 10
def local_func(x):
return x * local_var
return local_func
data = fory.dumps(my_function())
print(fory.loads(data)(10)) # 100
# Lambdas
data = fory.dumps(lambda x: 10 * x)
print(fory.loads(data)(10)) # 100
```
## Serialize Global Classes/Methods
Serialize class objects, instance methods, class methods, and static methods:
```python
from dataclasses import dataclass
import pyfory
fory = pyfory.Fory(xlang=False, ref=True, strict=False)
@dataclass
class Person:
name: str
age: int
def f(self, x):
return self.age * x
@classmethod
def g(cls, x):
return 10 * x
@staticmethod
def h(x):
return 10 * x
# Serialize global class
print(fory.loads(fory.dumps(Person))("Bob", 25)) # Person(name='Bob', age=25)
# Serialize instance method
print(fory.loads(fory.dumps(Person("Bob", 20).f))(10)) # 200
# Serialize class method
print(fory.loads(fory.dumps(Person.g))(10)) # 100
# Serialize static method
print(fory.loads(fory.dumps(Person.h))(10)) # 100
```
## Serialize Local Classes/Methods
Serialize classes defined inside functions along with their methods:
```python
from dataclasses import dataclass
import pyfory
fory = pyfory.Fory(xlang=False, ref=True, strict=False)
def create_local_class():
class LocalClass:
def f(self, x):
return 10 * x
@classmethod
def g(cls, x):
return 10 * x
@staticmethod
def h(x):
return 10 * x
return LocalClass
# Serialize local class
data = fory.dumps(create_local_class())
print(fory.loads(data)().f(10)) # 100
# Serialize local class instance method
data = fory.dumps(create_local_class()().f)
print(fory.loads(data)(10)) # 100
# Serialize local class method
data = fory.dumps(create_local_class().g)
print(fory.loads(data)(10)) # 100
# Serialize local class static method
data = fory.dumps(create_local_class().h)
print(fory.loads(data)(10)) # 100
```