python args 不工作,除非它有一个位置参考

python args not working unless it has a position reference

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])

为了参考 - args 是:

date_year = datetime.now().year

为了使此查询正常工作,我需要将 args 引用为

.filter(fixture_datetime__year=args[0])

因为如果我使用

.filter(fixture_datetime__year=args)

我收到错误:

int() argument must be a string, a bytes-like object or a number, not 'tuple'

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

type(date_year)

我 class 回来了。

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

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

>>> def foo(*args): return args
...
>>> foo()
()
>>> foo(42)
(42,)
>>> foo(1, 2, 3)
(1, 2, 3)

如果你想要 一个 可选参数,将其设置为带有标记默认值的关键字参数,例如 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)
        )

如果您知道您正在接收日期作为第二个参数,那么请在签名中明确定义它

def test_stats(team, date):

如果你也可以传递一些不同的东西然后使用关键字参数

def test_stats(team, date=None, something_else=None):

*args 仅当您想传递参数序列而不事先创建序列时才应使用

def get_integers(*args):
    return args


>>> get_integers(1, 3, 4, 8, 9, 11)
(1, 3, 4, 8, 9, 11)

*args 是元组,**kwargs 是字典。