python args不工作,除非它有一个位置引用

pur*_*has 5 python args

def test_stats(team, *args):

    if not args:
          [do some stuff]
    else:

        team_fixtures = (Fixtures.objects.filter(home_team=team_details.id) | Fixtures.objects.filter(away_team=team_details.id))/
.filter(fixture_datetime__lt=datetime.now()).filter(fixture_datetime__year=args[0])
Run Code Online (Sandbox Code Playgroud)

为了参考起见 - args是:

date_year = datetime.now().year
Run Code Online (Sandbox Code Playgroud)

为了使这个查询工作,我需要引用args为

.filter(fixture_datetime__year=args[0])
Run Code Online (Sandbox Code Playgroud)

因为如果我使用

.filter(fixture_datetime__year=args)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

int()参数必须是字符串,类似字节的对象或数字,而不是'元组'

我知道它认为它是一个元组,即使它只是一个值,但是当我在终端中执行以下操作时

type(date_year)
Run Code Online (Sandbox Code Playgroud)

我上课了.

当它看起来只有一个值返回时,为什么我必须在这里引用位置?

Mar*_*ers 4

-前缀参数始终*是一个元组。它捕获 0 个或多个额外的位置参数。您可以使用 3、20 或 100 个额外参数(超出显式参数)来调用函数,它们都将成为函数中元组的一部分:test_stats()teamargs

>>> def foo(*args): return args
...
>>> foo()
()
>>> foo(42)
(42,)
>>> foo(1, 2, 3)
(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

如果您想要一个可选参数,请将其设为带有哨兵默认值的关键字参数,例如None

def test_stats(team, optional=None):
    if optional is None:
        # ...
    else:
        team_fixtures = (
            Fixtures.objects.filter(home_team=team_details.id) |
            Fixtures.objects.filter(away_team=team_details.id))
                .filter(fixture_datetime__lt=datetime.now())
                .filter(fixture_datetime__year=optional)
        )
Run Code Online (Sandbox Code Playgroud)