Search code examples
pythonetherscan

Pythonic way to add optional parameters to API request


I'am trying to make an API request where I add some optional values but if I don't add them I don't want them to be in the request.

In this case, I would like the parameters to be 'startblock' & 'endblock'

def get_transactions_by_address_(self, address, action='txlist'):
    """

    :param address:
    :param action: [txlist, txlistinternal]

    :return:
    """
    token = self.etherscan_api_key
    return requests.get('https://api.etherscan.io/api'
                        '?module=account'
                        f'&action={action}'
                        f'&address={address}'
                        # '&startblock=0'
                        # '&endblock=92702578'
                        '&page=1'
                        '&offset=1000'
                        '&sort=desc'
                        f'&apikey={token}'
                        )

I was thinking on adding some conditionals like

request_url = 'https://api.etherscan.io/api...'
if startblock:
    request_url = request_url + f'&startblock={startblock}'
if endblock:
    request_url = request_url + f'&endblock={endblock}'

But I don't know if it is the most pythonic way to do it and I would like to get other options on how to do it


Solution

  • Use the payload option instead of constructing the URL yourself. For example, create a dict containing all the required options, then add additional parameters to the dict as necessary. requests.get will build the required URL from the base URL and the values found in your dict.

    options = {
            'module': 'account',
            'action': action,
            'address': address,
            'apikey': token,
            'sort': sort,
            'page': page,
            'offset': offset
        }
    if startblock:
        options['startblock'] = startblock
    if endblock:
        options['endblock'] = endblock
    
    return requests.get('https://api.etherscan.io/api', params=options)