Is passing too many arguments to the constructor considered an anti-pattern?

前端 未结 5 871
独厮守ぢ
独厮守ぢ 2021-01-01 20:31

I am considering using the factory_boy library for API testing. An example from the documentation is:

class UserFactory(factory.Factory):
    class Meta:
            


        
5条回答
  •  鱼传尺愫
    2021-01-01 21:04

    In Python 3.7, dataclasses (specified in PEP557) were added. This allows you to only write these arguments once and not again in the constructor, since the constructor is made for you:

    from dataclasses import dataclass
    
    @dataclass
    class User:
        title: str = None
        first_name: str = None
        last_name: str = None
        company_name: str = None
        mobile: str = None
        landline: str = None
        email: str = None
        password: str = None
        fax: str = None
        is_guest: bool = True
        wants_sms_notification: bool = False
        wants_email_notification: bool = False
        wants_newsletter: bool = False
        street_address: str = None
    

    It also adds a __repr__ to the class as well as some others. Note that explicitly inheriting from object is no longer needed in Python 3, since all classes are new-style classes by default.

    There are a few drawbacks, though. It is slightly slower on class definition (since these methods need to be generated). You need to either set a default value or add a type annotation, otherwise you get a name error. If you want to use a mutable object, like a list, as a default argument, you need to use dataclass.field(default_factory=list) (normally it is discouraged to write e.g. def f(x=[]), but here it actually raises an exception).

    This is useful where you have to have all those arguments in the constructor, because they all belong to the same object and cannot be extracted to sub-objects, for example.

提交回复
热议问题