I am working on an API wrapper for calls to a website. Each of several types of calls can take a large number of optional arguments, some of which contradict. In the interest of preventing the user from supplying incompatible parameters, I would like to verify that the arguments are correct before submitting the request.
However, the simplest technique to do so has resulted in the below nightmare, with several if-statements. I know this is not a best practice, but I am unsure what the best method to correct it would be. I know that using *kwargs would probably be involved, but I don't see how that would save me from verifying the arguments in much the same way as below. I have heard that I should probably wrap the arguments in a class, but I'm unsure how much of a better idea that is.
def list_tag_alias(
self,
name_matches: str = None,
status: str = None,
order: str = None,
antecedent_tag: int = None,
consequent_tag: int = None,
limit: int = None,
before_page: int = None,
after_page: int = None,
page: int = None,
):
query_url = "tag_aliases.json?"
arguments = []
if name_matches != None:
arguments.append("search[name_matches]={}".format(name_matches))
if status != None:
assert status.lower() in (
"approved",
"active",
"pending",
"deleted",
"retired",
"processing",
"queued",
"blank",
), "status must be one of: approved, active, pending, deleted, retired, processing, queued, or blank."
arguments.append("search[status]={}".format(status.lower()))
if order != None:
assert order.lower() in (
"status",
"created_at",
"updated_at",
"name",
"tag_count",
), "order must be one of status, created_at, updated_at, name, tag_count"
arguments.append("search[order]={}".format(order.lower()))
if antecedent_tag != None:
assert 0 <= antecedent_tag <= 8
arguments.append(
"search[antecedent_tag][category]={}".format(str(antecedent_tag))
)
if consequent_tag != None:
assert 0 <= consequent_tag <= 8
arguments.append(
"search[consequent_tag][category]={}".format(str(consequent_tag))
)
if limit != None:
assert 0 <= limit <= 1000, "limit must be between 0 and 1000, inclusive"
arguments.append("limit={}".format(str(limit)))
if before_page != None:
assert (
after_page == None and page == None
), "only one of before_page, after_page, or page must be supplied."
assert before_page >= 0, "before_page must be greater than 0"
arguments.append("page=b{}".format(str(before_page)))
if after_page != None:
assert (
before_page == None and page == None
), "only one of before_page, after_page, or page must be supplied."
assert after_page >= 0, "after_page must be greater than 0"
arguments.append("page=a{}".format(str(after_page)))
if page != None:
assert (
before_page == None and after_page == None
), "only one of before_page, after_page, or page must be supplied."
arguments.append("page={}".format(str(page)))
query_url += "&".join(arguments)
request = WebRequest(state_info=self.state_info)
response = request.submit_request(query_url=query_url)
return response.json()
```