向 API 请求添加可选参数的 Pythonic 方式

Pythonic way to add optional parameters to API request

我正在尝试发出 API 请求,我在其中添加了一些可选值,但如果我不添加它们,我不希望它们出现在请求中。

在这种情况下,我希望参数为 '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}'
                        )

我正在考虑添加一些条件,例如

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}'

但我不知道这是否是最符合 pythonic 的方法,我想了解其他方法

使用 payload 选项而不是自己构建 URL。例如,创建一个包含所有必需选项的 dict,然后根据需要向字典添加其他参数。 requests.get 将从基础 URL 和您的 dict.

中找到的值构建所需的 URL
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)

正确的实现方式是:

def get_transactions_by_address_(self, address,
                                 action='txlist',
                                 sort='desc',
                                 page=1,
                                 offset=1000,
                                 startblock=None,
                                 endblock=None):
    
    token = self.etherscan_api_key
    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
                        )