可选字段需要一个必要的值

Optional field requires a necessary value

我有一个带有可选字段的函数 url

def create_ads_task(
    template_id: int,
    ad_account_id: str,
    adset_ids: List[str],
    placements: Dict[str, str],
    locales: List[Locale],
    url: Optional[HttpUrl],
) -> List[Dict[str, Union[str, int]]]:
    ...body...

当我 运行 测试时,出现错误

E       TypeError: create_ads_task() missing 1 required positional argument: 'url'

test.py

assert create_ads_task(
    TEMPLATE_ID, AD_ACCOUNT_ID, ADSET_IDS, PLACEMENTS, LOCALES
) == [ ..... ]

现在如何修复测试,但我不明白为什么需要可选字段。该函数并不总是需要 url 参数,有时它不是从前端传递的。如何正确定义可选参数?

类型提示它是可选的是不够的。您必须为其分配一个默认值。喜欢:

def create_ads_task(
    template_id: int,
    ad_account_id: str,
    adset_ids: List[str],
    placements: Dict[str, str],
    locales: List[Locale],
    url: Optional[HttpUrl] = None,
) -> List[Dict[str, Union[str, int]]]:
    ...body...

Optional[..] 表示传递的参数 应该 提到的类型或 None,就像你的情况 url 应该是键入 HttpUrl OR None,但这并不意味着如果未通过它将带有默认值。请参阅以下示例:

from typing import Optional

# In this b will should be passed as str or None
def test_with_optional(a: str, b: Optional[str]):
    print (a,b)
    
# In this if b is not passed, it will carry a default value of None
def test_with_none(a: str, b: str=None):
    print (a,b)
    
test_with_optional('1', None)
test_with_none('2')

test_with_optional('1') 将抛出错误 TypeError: test_with_optional() missing 1 required positional argument: 'b' 因为它期望 b 为 stringNone.

对于您的情况,您的定义如下。详细了解可选参数 here

def create_ads_task(
        template_id: int,
        ad_account_id: str,
        adset_ids: List[str],
        placements: Dict[str, str],
        locales: List[Locale],
        url: Optional[HttpUrl]=None,
    ) -> List[Dict[str, Union[str, int]]]:
        ...body...