Python 如何处理需要太多参数的函数?

Python 如何处理需要太多参数的函数?,python,Python,我有一个类似这样的类: class Product(BaseModel): code: str = ... discription_one: str = ... famille: FamilleProduct sou_famille: SouFamileProduct parent: ParentProduct sou_parent: SouParentProduct group: GroupProduct sou_group: S

我有一个类似这样的类:

class Product(BaseModel):
    code: str = ...
    discription_one: str = ...
    famille: FamilleProduct
    sou_famille: SouFamileProduct
    parent: ParentProduct
    sou_parent: SouParentProduct
    group: GroupProduct
    sou_group: SouGroupProduct
    reference: Optional[str] = ''
    oem: Optional[str] = ''
    other_code: Optional[str] = ''
    discription_two: Optional[str] = ''
    discription_three: Optional[str] = ''
    remarque: Optional[str] = ''
    marque: Marque
    origine: Country
    unite: UniteProduct
    code_sh: ShCode
    numbre_serie: NumbreSerie
    qr_code: QrProduct
    status: StatusProduct
    product_visible: bool = True
    product_loocked: bool = False
    product_hided: bool = False
    location: LocationProduct
    last_prix_achat: float = 0.00
    pmp_achat: float = 0.00
    prix_achat_devise: List[PrixAchat]
    prix_vente: List[PrixVente]
    tva: TvaProduct
    tax: TaxProduct
    qtt_achat: float = 0.00
    qtt_actuel: float = 0.00
    qtt_vente: float = 0.00
    qtt_min: float = 0.00
    qtt_max: float = 0.00
    qtt_arrivage: float = 0.00
    qtt_cmdfr: float = 0.00
    qtt_cmdcl: float = 0.00
    date_fab: datetime = None
    date_exp: datetime = None
    created_at: datetime = None
    updated_at: datetime = None
    images: List[ImageProduct] = None
当我试图编写一个函数来创建此模型时,我发现自己正在处理一个参数太多的函数:

def creat_product(self,a: str, b: str, c: None, d: None, e: None, f: None, g: None, h: None, i: str
                    j: str, k: str, l: str, m: str, n: str) -> Product:
    return Product(
        code=a,
        discription_one=b,
        famille=c,
        sou_famille=d,
        parent=e,
        sou_parent=f,
        group=g,
        sou_group=h,
        reference=i,
        oem=j,
        other_code=k,
        discription_two=l,
        discription_three=m,
        remarque=n,...# and other paramaters)

对于所有具有
None
值的参数,是否可以在调用
create_product
时添加它们,或者保留它们
None
?还有其他方法吗?

您可以使用
**kwargs
来指定您的函数可以接受任意数量的参数。尽管这意味着您可以通过提供比
产品所需参数更少的参数来调用函数,但是任何问题都将直接从构造函数报告

def creat_product(self, **kwargs) -> Product:
   return Product(**kwargs)
您应该能够像以前一样准确地调用它:

self.create_product(a='a', b='b', ...)

注意,通过这种方式,您可以通过提供字典作为参数来调用函数。比如说,

my_args = {'a': 'val1', 'b': 'val2', ...}
create_product(**my_args)

作为旁注,我想
create\u product
是一个替代构造函数,因此将其更改为类方法更有意义:

@classmethod
def creat_product(cls, **kwargs):
    return cls(**kwargs)

您可以使用
**kwargs
指定函数可以接受任意数量的参数。尽管这意味着您可以通过提供比
产品所需参数更少的参数来调用函数,但是任何问题都将直接从构造函数报告

def creat_product(self, **kwargs) -> Product:
   return Product(**kwargs)
您应该能够像以前一样准确地调用它:

self.create_product(a='a', b='b', ...)

注意,通过这种方式,您可以通过提供字典作为参数来调用函数。比如说,

my_args = {'a': 'val1', 'b': 'val2', ...}
create_product(**my_args)

作为旁注,我想
create\u product
是一个替代构造函数,因此将其更改为类方法更有意义:

@classmethod
def creat_product(cls, **kwargs):
    return cls(**kwargs)

Related:Related:“注意,通过这种方式,您可以通过提供一个字典作为参数来调用函数。”-在定义中使用
**
实际上并不需要这样做。您可以在调用站点对常规参数使用
***
解包,即使函数定义没有使用
***
“请注意,通过这种方式,您可以通过提供字典作为参数来调用函数。”-在定义中使用
***
,实际上并不需要这样做。即使函数定义没有使用
**
,也可以在调用站点使用
**
解包来获取常规参数。