请参阅代码here
move_from, move_to = [
(item['path'], prev_item['path']),
(prev_item['path'], item['path']),
][item['op'] == 'add']
分配给move_from和move_to的内容。看起来像双重任务,但是没有看到右边的两个(我是非python程序员)我试图移植到Javascript,它会是什么样子?
感谢。
答案 0 :(得分:5)
这个
[
(item['path'], prev_item['path']),
(prev_item['path'], item['path']),
]
是一个Python列表。第一个(0)项是
(item['path'], prev_item['path'])
,第二个(1)是
(prev_item['path'], item['path'])
这里的布尔值
[item['op'] == 'add']
评估为True的假(1或0),以便选择其中一个项目。
例如,如果item ['op']等于'add',则结果为
move_from, move_to = prev_item['path'], item['path']
编辑: 你问了JS代码。这可能会这样做。请注意,我假设大多数变量都是全局变量,因为我不知道您将在何种上下文中使用它。
String.prototype.rsplit = function(sep, maxsplit) {
var split = this.split(sep);
return maxsplit ? [ split.slice(0, -maxsplit).join(sep) ].concat(split.slice(-maxsplit)) : split;
}
function _optimize_using_move(prev_item, item) {
prev_item['op'] = 'move';
if (item['op'] == 'add') {
prev_item['from'] = prev_item['path'];
prev_item['path'] = item['path'];
} else {
var parts = move_from.rsplit('/', 1);
head = parts[0];
move_from = parts[1];
move_from = int(item['path']) - 1;
prev_item['from'] = head + '/' + item['path'];
prev_item['path'] = prev_item['path'];
}
}
答案 1 :(得分:3)
将其拆分为两个步骤。
第一
print ['a', 'b'][0 == 1]
# 'a'
print ['a', 'b'][0 == 0]
# 'b'
在python中,如果使用布尔值作为数组索引,则False
被视为0,True
被视为1.因此,在您的情况下,
[
(item['path'], prev_item['path']),
(prev_item['path'], item['path']),
][item['op'] == 'add']
如果(item['path'], prev_item['path'])
不是item['op']
,则应为"add"
,(prev_item['path'], item['path'])
。
然后是作业
a, b = (0, 1)
与a = 0
,b = 1
非常相似。在您的情况下,如果item['op']
等于"add"
,则结果为
move_from = prev_item['path']
move_to = item['path']
虽然使用布尔值是完全有效的,但我不建议这样的程序。更常见的惯例是使用CONSEQUENCE if PREDICATE else ALTERNATIVE
(如C语言中的PREDICATE ? CONSEQUENCE : ALTERNATIVE
)
move_from, move_to = (prev_item['path'], item['path']) \
if item['op'] == 'add' else \
(item['path'], prev_item['path'])
由于JS中没有元组赋值,我认为一种简单的方法是
if (item['op'] === 'add') {
move_from = prev_item['path'];
move_to = item['path'];
} else {
move_from = item['path'];
move_to = prev_item['path'];
}
答案 2 :(得分:1)
正如sdolan所说,[item['op'] == 'add']
将选择使用两个元组中的哪一个来引用move_from和move_to。
自己尝试这种简化,并将[True]切换为[False]进行比较:
move_from, move_to = [(1, 2), (3, 4),][True]
print(move_from)
print(move_to)
答案 3 :(得分:0)
你在这里看到的是pythonist经常在代码高尔夫中使用的小技巧。 让我们打破这段代码。
move_from, move_to = [
(item['path'], prev_item['path']),
(prev_item['path'], item['path']),
][item['op'] == 'add']
第一:
[item['op'] == 'add']
这样做会将item['op']
与add
进行比较
然后,该比较返回布尔值,即True
或False
在python中True
和False
基本上分别等同于1
和0
。
现在基本上我们有:
move_from, move_to = [
(item['path'], prev_item['path']),
(prev_item['path'], item['path'])
][<0 or 1>]
现在,根据比较是真还是假,返回此数组的第一个或第二个元素。
在这两种情况下,返回的对象(或从数组/列表中选择的)是以下形式的元组:
(a, b)
。
现在Python做了一个名为tuple unpacking的东西。
所以当你看到:
move_from, move_to = (a, b)
它实质上意味着:
move_from = a
和
move_to = b
我希望澄清这段代码的工作原理。