带有可选数据类参数的Python函数调用导致错误

带有可选数据类参数的Python函数调用导致错误,python,function,parameter-passing,python-dataclasses,Python,Function,Parameter Passing,Python Dataclasses,我试图将数据类对象作为可选参数传递给函数,但被卡住了。 因此,这里有一个简单的代码来描述这个问题。 首先,我定义一个数据类: @dataclass class SomeObject: A: str 如果我将参数设置为非可选,则没有问题: def printObject0 (Index, AnyObject): print(Index, AnyObject.A) Object1 = SomeObject ("A") printObject0 (1, Obj

我试图将数据类对象作为可选参数传递给函数,但被卡住了。 因此,这里有一个简单的代码来描述这个问题。 首先,我定义一个数据类:

@dataclass
class SomeObject:
    A: str
如果我将参数设置为非可选,则没有问题:

def printObject0 (Index, AnyObject):
    print(Index, AnyObject.A)

Object1 = SomeObject ("A")

printObject0 (1, Object1)

# gives:
# 1 A
但是,如果我尝试将其设置为可选参数*args,如下所示

def printObject1 (Index, *AnyObject):
    print(Index, AnyObject.A)

Object1 = SomeObject ("A")

printObject1 (1, Object1)
# gives:
# AttributeError: 'tuple' object has no attribute 'A'
def printObject2 (Index, **AnyObject):
    print(Index, AnyObject.A)
    
Object1 = SomeObject ("A")

printObject2 (1, Object1)
# gives:
# TypeError: printObject2() takes 1 positional argument but 2 were given
…或者像这样的**kwargs

def printObject1 (Index, *AnyObject):
    print(Index, AnyObject.A)

Object1 = SomeObject ("A")

printObject1 (1, Object1)
# gives:
# AttributeError: 'tuple' object has no attribute 'A'
def printObject2 (Index, **AnyObject):
    print(Index, AnyObject.A)
    
Object1 = SomeObject ("A")

printObject2 (1, Object1)
# gives:
# TypeError: printObject2() takes 1 positional argument but 2 were given
我得到上述错误


有人知道如何使对象成为可选对象吗?

函数参数
*AnyObject
表示
AnyObject
是所有剩余位置参数的元组。所以你可以

从数据类导入数据类
@数据类
类对象:
A:str
def printObject_1(idx,*objs):
打印(idx,objs[0].A)
printObject_1(1,SomeObject('A'))1a
此外,函数参数
**AnyObject
意味着
AnyObject
是所有剩余关键字参数的字典。因此,您可以:

def printObject_2(idx,**objs):
打印(idx,objs['foo'].A)
printObject_2(1,foo=SomeObject('A'))#1 A
顺便说一句:通常,可选函数参数有默认值,如

def printObject_3(idx,obj=SomeObject('A')):
打印(idx,obj.A)
printObject_3(1)#1 A
printObject_3(1,SomeObject('ABC'))#1 ABC
printObject_3(1,obj=SomeObject('ABC'))#1 ABC
通常,应该避免第二个函数调用,因为它更容易出错

但由于默认参数值在这种情况下是可变的(见下文),因此这样做更安全

def printObject_4(idx,obj=None):
如果obj为无:
obj=SomeObject('A')
打印(idx,obj.A)
printObject_4(1)#1 A
printObject_4(1,obj=SomeObject('ABC'))#1 ABC
printObject_3
的问题在于,您可以在函数中更改默认值:

def printObject_3_buggy(idx,obj=SomeObject('A')): 打印(idx,obj.A) 对象A=321 printObject_3_buggy.u___#默认值(SomeObject(A='A'),) printObject_3_小车(1)#1 A printObject_3_buggy.____#默认值(SomeObject(A=312),) printObject_3_小车(1)#1 321
出现这种意外行为的原因是默认值是可变的。因此,当您想要使用可变的默认值或小心不要写入关键字参数时,请使用
printObject_4
中的模式。

感谢您提供了这一有见地的答案!在我的例子中,printObject_4解决方案可以正常工作。由于您解释了printObject_4解决方案对默认值的影响:是否有一种方法可以将对象像指针一样传递给函数(用C语言表示),以便在函数中对其进行修改?def printObject1(Index,AnyObject=None):