Python 将dataclass作为默认参数传递

Python 将dataclass作为默认参数传递,python,python-dataclasses,Python,Python Dataclasses,我有一些带有默认值的数据类: @dataclasses.dataclass class SomeDataclass: field: str = "" number: int = 3 我有一个函数将其作为参数接收。我想使它能够接收空参数,这将导致它实例化一个默认的数据类。这就是我想要的行为: def func(instance: SomeDataClass = None): # I want to get rid of these lines

我有一些带有默认值的数据类:

@dataclasses.dataclass
class SomeDataclass:
    field: str = ""
    number: int = 3
我有一个函数将其作为参数接收。我想使它能够接收空参数,这将导致它实例化一个默认的数据类。这就是我想要的行为:

def func(instance: SomeDataClass = None):
    # I want to get rid of these lines
    if instance is None:
        instance = SomeDataClass()

如果函数不修改
SomeDataclass的实例,您可以安全地使用它

def func(instance: SomeDataClass = SomeDataclass()):
    ...
当对函数的每次调用都应该获得自己的、可变值的新实例(如
列表
dict
)时,使用check for-
None
习惯用法


否则,否:您需要一个哨兵来指示
func
是否应该实例化
SomeDataclass
本身。

如果函数不修改
SomeDataclass
的实例,您可以安全地使用

def func(instance: SomeDataClass = SomeDataclass()):
    ...
当对函数的每次调用都应该获得自己的、可变值的新实例(如
列表
dict
)时,使用check for-
None
习惯用法


否则,否:您需要一个哨兵来指示
func
是否应该实例化
SomeDataclass
本身。

另一个选项是动态定义类并动态实例化它

这里的主要问题是我们定义了两次类

因此,我不认为这是一种方法,直到我们可以有一种方法来定义类只有一次

from dataclasses import dataclass,field
import dataclasses

@dataclass
class SomeDataClass:
    f: str = 'jack'
    number: int = 12
                   

def foo(data=dataclasses.make_dataclass('SomeDataClass',[('f',str,field(default='jack')),('number', int,field(default=12))])()):
  print(data)

foo()
foo(SomeDataClass('jim',33))
输出

SomeDataClass(f='jack', number=12)
SomeDataClass(f='jim', number=33)

另一个选项是动态定义类,并动态实例化它

这里的主要问题是我们定义了两次类

因此,我不认为这是一种方法,直到我们可以有一种方法来定义类只有一次

from dataclasses import dataclass,field
import dataclasses

@dataclass
class SomeDataClass:
    f: str = 'jack'
    number: int = 12
                   

def foo(data=dataclasses.make_dataclass('SomeDataClass',[('f',str,field(default='jack')),('number', int,field(default=12))])()):
  print(data)

foo()
foo(SomeDataClass('jim',33))
输出

SomeDataClass(f='jack', number=12)
SomeDataClass(f='jim', number=33)

谢谢你的编辑。我想我们应该清理一下评论谢谢你的编辑。我想我们应该整理一下评论这是个大问题。定义一个新类有什么好处?这是一个大问题。定义一个新类有什么好处?