Как применить значение по умолчанию к полю класса данных Python, когда None был передан? - PullRequest
0 голосов
/ 19 июня 2019

РЕДАКТИРОВАТЬ: для ясности мне нужно class, который будет принимать ряд параметров, я знаю, что все параметры будут предоставлены, но некоторые могут быть переданы как None, в этом случае мой class будет иметьпредоставить значения по умолчанию.

Я хочу настроить простое dataclass с некоторыми значениями по умолчанию, например так:

@dataclass
class Specs1:
    a: str
    b: str = 'Bravo'
    c: str = 'Charlie'

Я бы хотел получить значение по умолчанию длявторое поле, но все еще установить значение для третьего.Я не могу сделать это с None, потому что он счастливо принят в качестве значения для моей строки:

r1 = Specs1('Apple', None, 'Cherry') # Specs1(a='Apple', b=None, c='Cherry')

Я нашел следующее решение:

@dataclass
class Specs2:
    def_b: ClassVar = 'Bravo'
    def_c: ClassVar = 'Charlie'
    a: str
    b: str = def_b
    c: str = def_c

    def __post_init__(self):
        self.b = self.def_b if self.b is None else self.b
        self.c = self.def_c if self.c is None else self.c

, которое, кажется, ведет себя какПредполагается:

r2 = Specs2('Apple', None, 'Cherry') # Specs2(a='Apple', b='Bravo', c='Cherry')

Однако я чувствую, что это довольно некрасиво и что я, возможно, что-то здесь упускаю.В моем настоящем классе будет больше полей, поэтому он станет только хуже.

РЕДАКТИРОВАТЬ: я должен добавить, что параметры, передаваемые в класс, содержат None, и я не могу контролировать этот аспект.

Ответы [ 3 ]

1 голос
/ 19 июня 2019

Я понимаю, что вам нужны позиционные аргументы. Это может быть достигнуто с помощью встроенных условных выражений (для удобочитаемости кода).

class Specs():
    def __init__(self, a=None,b=None,c=None):
        self.a = a if a is not None else 'Apple'
        sefl.b = b if b is not None else 'Bravo'
        self.c = c if c is not None else 'Cherry'
example = Specs('Apple', None, 'Cherry')

Этот подход может быть осуществлен без init метода, если вы предпочитаете его таким образом.

Однако вы можете рассмотреть метод __ init __ () с именованными аргументами.

class Specs():
    def __init__(self, a = 'Apple', b = 'Bravo', c = 'Cherry'):
        self.a = a
        self.b = b
        self.c = c
example = Specs('Apple', c = 'Cherry')
0 голосов
/ 19 июня 2019

Не слишком ясно, что вы пытаетесь сделать со своим классом. Разве эти значения по умолчанию не являются скорее свойствами?

Возможно, вам нужно определение, используемое вашим классом, которое имеет параметры по умолчанию, такие как:

def printMessage(name, msg = "My name is "):  
    print("Hello! ",msg + name)

printMessage("Jack")

То же самое относится и к классам.

Подобные дебаты по поводу "Нет" можно найти здесь: Вызвать функцию без необязательных аргументов, если они отсутствуют

0 голосов
/ 19 июня 2019

Использовать ключевые параметры. Вы можете просто сделать r2 = Specs1('Apple', c='Cherry'). Вам не нужно использовать None. См. здесь .

Выход:

Specs1(a='Apple', b='Bravo', c='Cherry')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...