Python3-如何调用一个可变地接受* args的函数

时间:2016-10-14 14:56:24

标签: python python-3.x arguments parameter-passing

一般性问题

用于调用接受* args的函数的python3.5 +语法是什么,其中* args引用具有多个项的变量。

  

我是自学python;我不禁想到我错过了一些关于* args如何运作的基本内容。请随意给我一些必要的阅读。

具体问题

使用operator.itemgetter(* items)按列对列表进行排序时,如何可变地提供*项目?

样本列表

import operator

records = [
    ['0055613893 ', 'AP', 'BU', 'AA', '00005000012404R'],
    ['0048303110 ', 'MM', 'BU', 'AB', '00028230031385R'],
    ['0044285346 ', 'AP', 'BU', 'AA', '00062240050078R'],
    ['0048303108 ', 'MO', 'BU', 'AF', '00047780036604R'],
    ['0048751228 ', 'AP', 'ME', 'AC', '00000750013177R'],
    ['0045059521 ', 'AR', 'YT', 'AB', '00005430014570R']
]

如果我想按第3列排序这个特定的记录集,然后按第1列排序,我会:

records.sort(key=operator.itemgetter(3, 1))

当然,这可以像人们期望的那样发挥作用。

我得到的是如何可变地为itemgetter()提供“3,1”?

即:

indices = {insert some code here to provide itemgetter() what it needs} records.sort(key=operator.itemgetter(indices))

我试过了:

元组:

indices = (3, 1) 要么 indices = 3, 1

TypeError: list indices must be integers or slices, not tuple

列表:

indices = [3, 1]

TypeError: list indices must be integers or slices, not list

  

对基础知识感到谦卑永远不会太晚。提前感谢您协助填补我的python基础中的这个空白。

1 个答案:

答案 0 :(得分:1)

假设你有

var scope;
var controller;
var mockedMyFactory;

beforeEach(module('my'));

beforeEach(module('my', function ($provide) {
    mockedMyFactory = {
        getThingys: jasmine.createSpy()
    };
    $provide.value('myFactory', mockedMyFactory);
}));

beforeEach(inject(function ($controller, $rootScope, myFactory) {
    scope = $rootScope.$new();
    controller = $controller('MyCtrl', {
        $scope: scope, myFactory
    });
}));

describe('this', function () {
    it('is a dummy spec', function () {
        expect(2 + 2).toEqual(4);
    });
});

您可以使用Python解包来为函数调用提供3和1:

indices = [3, 1]

这相当于

itemgetter(*indices)

我不确定它的Python版本是什么。这是快速变化的部分之一,因此如果您使用旧版本,可能需要做一些阅读。