Как проверить, передает ли пользователь хотя бы один из аргументов? - PullRequest
0 голосов
/ 06 февраля 2020

Иногда объект может быть создан с помощью различных типов аргументов. Например, объект круга может быть определен либо путем предоставления его радиуса или его окружности. Как мне написать метод __init__, чтобы он создавал объект круга как при вводе пользователем радиуса, так и при вводе окружности.

Я придумал это, но он выглядит слишком раздутым:

class Circle:

    def __init__(self, radius = None, circumference = None):

        # Calculate area when user provides circumference
        if radius is None and circumference is not None:
            self.area = (circumference**2) / (4*3.14)

        # Calculate area when user provides radius
        elif radius is not None and circumference is None:
            self.area = (radius ** 2) * 3.14

        # Raise error if neither radius nor circumference or both are provided
        else:
            raise TypeError("Pass either a radius or circumference argument value")

По умолчанию для параметров задано значение None или для этого сценария предусмотрен правильный способ Python?

Кроме того, правильно ли в этом случае использование TypeError?

Я даже не знаю, считаются ли радиус и окружность необязательными или обязательными аргументами, поскольку хотя бы один из них как-то требуется. Может кто-нибудь просветить меня, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Я бы просто расставил приоритеты для одного из обоих аргументов, если два предоставлены. Это было бы что-то вроде этого:

class Circle:

    def __init__(self, radius = None, circumference = None):

        # Calculate area when user provides circumference
        if circumference:
            self.area = (circumference**2) / (4*3.14)

        # Calculate area when user provides radius
        elif radius:
            self.area = (radius ** 2) * 3.14

        # Raise error if neither radius nor circumference or both are provided
        else:
            raise TypeError("Pass either a radius or circumference argument value")
1 голос
/ 06 февраля 2020

Предположим, вы хотите ответить на вопрос заголовка:

Ваш код выглядит нормально, но вы могли бы использовать параметр **kwargs вместо перечисления всех возможных кандидатов, которые можно проверить на предмет наличия чего-либо легко, не вдаваясь в подробности.

Для общего подхода:

Я полагаю, что ваша разбивка функциональности добавляет сложности: почему вычисления используются в конструкторе? Рассмотрим этот интерфейс:

   c = Circle()
   c.setRadius(4.5) # alternatively: c.setCircumference(13.7)
   print(c.getArea())
...