Методы с взаимоисключающими аргументами - PullRequest
0 голосов
/ 02 апреля 2020

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

def url('protocol','hostname','uri','port', 'url')

, но нам не нужны «протокол», «имя хоста», «uri», «порт», если мы предоставили полный 'url' это можно сделать с помощью необязательных аргументов, а затем проверить, что не пусто, но это действительно глупо:

def url('protocol'= None,'hostname' = None,'uri'= None,'port' = None, 'url'= None)

также я не вижу это как

def url(*args)

, потому что мы Придется создать парсер, чтобы увидеть, что нам передают.

Как мне создать методы с взаимоисключающими аргументами вроде этого?

1 Ответ

0 голосов
/ 02 апреля 2020

Способ сделать это в классе - использовать методы класса для создания объектов из различных наборов параметров.

class Url:                                                                      
    def __init__(self, full_url):                                               
        self.url = full_url                                                     

    @classmethod                                                               
    def from_url(cls, full_url):                                                     
        return cls(full_url)                                                    

    @classmethod                                                               
    def from_parts(cls, protocol, hostname, uri, port):
        # Join the parameters and construct object                             
        full_url = f"{protocol}://{hostname}:{port}"                            
        return cls(full_url)

Использование:

my_url = Url.from_url("http://google.com")                                  
my_url = Url.from_parts("https", "google.com", "", "8080")

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

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