首页 文章

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

提问于
浏览
5

这个问题在这里已有答案:

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()参数必须是字符串,类似字节的对象或数字,而不是'元组'

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

type(date_year)

我上课了 .

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

2 回答

  • 4

    * -prefixed参数是 always 元组 . 它捕获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)
            )
    
  • 1

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

    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 是一个字典 .

相关问题