YOLOv8中是如何实现类似将结构体作为函数参数传递
flyfish
实现类似将结构体作为函数参数传递可以有多种方式
可以使用类(class)来定义一个类似结构体(struct)的数据结构,然后将其作为函数参数传递
class MyStruct:
def __init__(self, param1, param2, param3):
self.param1 = param1
self.param2 = param2
self.param3 = param3
def my_function(struct):
print(f"param1: {struct.param1}")
print(f"param2: {struct.param2}")
print(f"param3: {struct.param3}")
# 创建一个结构体实例
my_struct_instance = MyStruct(param1="value1", param2="value2", param3="value3")
# 将结构体实例传递给函数
my_function(my_struct_instance)
使用 dataclasses 模块
from dataclasses import dataclass
@dataclass
class MyStruct:
param1: str
param2: str
param3: str
def my_function(struct: MyStruct):
print(f"param1: {struct.param1}")
print(f"param2: {struct.param2}")
print(f"param3: {struct.param3}")
# 创建一个结构体实例
my_struct_instance = MyStruct(param1="value1", param2="value2", param3="value3")
# 将结构体实例传递给函数
my_function(my_struct_instance)
使用 **kwargs 传递参数
**kwargs 允许将任意数量的关键字参数传递给一个函数。通过这种方式,可以创建一个类似于结构体的参数列表,而不需要预先定义一个类
示例1:简单使用
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
# 调用函数并传递参数
my_function(param1="value1", param2="value2", param3="value3")
示例2:检查特定参数
def my_function(**kwargs):
if 'param1' in kwargs:
print(f"param1: {kwargs['param1']}")
if 'param2' in kwargs:
print(f"param2: {kwargs['param2']}")
if 'param3' in kwargs:
print(f"param3: {kwargs['param3']}")
# 调用函数并传递参数
my_function(param1="value1", param2="value2", param3="value3")
类似YOLOv8中使用的例子
在YOLOv8中函数的传参,大量的地方使用了**kwargs
def process_kwargs(**kwargs):
kwargs["conf"] = kwargs.get("conf") or 0.1
kwargs["batch"] = kwargs.get("batch") or 1
kwargs["mode"] = "track"
print(f"conf: {kwargs['conf']}")
print(f"batch: {kwargs['batch']}")
print(f"mode: {kwargs['mode']}")
# 示例1:传递部分参数
process_kwargs(conf=0.5)
# 输出:
# conf: 0.5
# batch: 1
# mode: track
# 示例2:不传递任何参数
process_kwargs()
# 输出:
# conf: 0.1
# batch: 1
# mode: track
# 示例3:传递所有参数
process_kwargs(conf=0.8, batch=5, mode="detect")
# 输出:
# conf: 0.8
# batch: 5
# mode: track