При использовании jQuery UI, у Вас есть переводы для общих кодов клавиши. В ui/ui/ui.core.js:
$.ui.keyCode = {
...
ENTER: 13,
...
};
существуют также некоторые переводы в tests/simulate/jquery.simulate.js, но я не мог найти никого в базовой библиотеке JS. Следите за Вами, я просто grep'ed источники. Возможно, существует некоторый другой способ избавиться от этих магических чисел.
можно также использовать String.charCodeAt и .fromCharCode:
>>> String.charCodeAt('\r') == 13
true
>>> String.fromCharCode(13) == '\r'
true
Единственное, что я мог бы изменить в вашем примере кода: если вы собираетесь использовать какое-то длинное имя, такое как self.memberlist
снова и снова, часто бывает больше читаемый псевдоним ("назначить") его сначала более короткому имени. Так, например, вместо длинного, трудно читаемого:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
вы можете кодировать:
L = self.memberlist
L[someindexA], L[someindexB] = L[someindexB], L[someindexA]
Помните, что Python работает по ссылке, поэтому L ссылается на тот же объект, что и self.memberlist
, НЕ копия (по тому же признаку назначение выполняется очень быстро, независимо от того, насколько длинным может быть список, потому что он все равно не копируется - это просто еще одна ссылка).
Я не думаю, что какие-либо дальнейшие осложнения оправданы , хотя, конечно, можно легко придумать некоторые причудливые, например (для a, b "нормальных" индексов > = 0
):
def slicer(a, b):
return slice(a, b+cmp(b,a), b-a), slice(b, a+cmp(a,b), a-b)
back, forth = slicer(someindexA, someindexB)
self.memberlist[back] = self.memberlist[forth]
Я думаю, что выяснение таких «продвинутых» применений - это хорошее самомнение, полезное умственное упражнение и хорошее развлечение - я рекомендую заинтересованным читателям, когда общая идея станет ясной, сосредоточиться на роли тех, кто + cmp
и то, как они заставляют все работать для трех возможностей (a> b, a
Помните, простой лучше, чем сложный !
сосредоточьтесь на роли этих + cmp
и на том, как они заставляют все работать для трех вариантов (a> b, a
Помните, простой лучше, чем сложный !
сосредоточьтесь на роли этих + cmp
и на том, как они заставляют все работать для трех вариантов (a> b, a
Помните, простой лучше, чем сложный !
a, b = b, a
Совершенно питонская идиома. Он короткий и читаемый, если имена ваших переменных достаточно короткие.
Трудно представить, как его можно было бы сделать более элегантным: с помощью гипотетической встроенной функции ... swap_sequence_elements (arr, first, second)
элегантно? возможно, но это на территории YAGGI - вы не получите этого ;-) - и накладные расходы на вызов функции будут / должны оттолкнуть вас от реализации этого самостоятельно.
То, что у вас есть, намного элегантнее, чем альтернативный встроенный способ:
temp = arr[first]
arr[first] = arr[second]
arr[second] = temp
и (бонус!) тоже быстрее (при небезосновательном предположении, что байт-код ROT_TWO
быстрее, чем LOAD_FAST
плюс STORE_FAST)
).
Я полагаю, вы могли бы воспользоваться аргументом step в нотации среза, чтобы сделать что-то вроде этого:
myarr [: 2] = myarr [: 2] [:: - 1]
Я не уверен, что это яснее или питоннее ...
a, b = b, a
примерно такой короткий, как вы получите, это всего три символа (не считая имен переменных) ..Он примерно такой же, как Python'y, который вы получите
. Одна альтернатива - обычная use-a-temp-variable:
self.memberlist[someindexA], self.memberlist[someindexB] = self.memberlist[someindexB], self.memberlist[someindexA]
.. становится ..
temp = self.memberlist[someindexB]
self.memberlist[someindexB] = self.memberlist[someindexA]
self.memberlist[someindexA] = temp
.. что я считаю более беспорядочным и менее "очевидным"
Другой способ, который может быть немного более читабельным с длинными именами переменных:
a, b = self.memberlist[someindexA], self.memberlist[someindexB]
self.memberlist[someindexA], self.memberlist[someindexB] = b, a