Я рекомендую GitHub: Array sortBy - лучшая реализация метода sortBy
, которая использует преобразование Шварца
. Но пока мы идем попробовать этот подход Gist: sortBy-old.js . Давайте создадим метод сортировки массивов, способных упорядочить объекты по некоторому свойству.
var sortBy = (function () {
var toString = Object.prototype.toString,
// default parser function
parse = function (x) { return x; },
// gets the item to be sorted
getItem = function (x) {
var isObject = x != null && typeof x === "object";
var isProp = isObject && this.prop in x;
return this.parser(isProp ? x[this.prop] : x);
};
/**
* Sorts an array of elements.
*
* @param {Array} array: the collection to sort
* @param {Object} cfg: the configuration options
* @property {String} cfg.prop: property name (if it is an Array of objects)
* @property {Boolean} cfg.desc: determines whether the sort is descending
* @property {Function} cfg.parser: function to parse the items to expected type
* @return {Array}
*/
return function sortby (array, cfg) {
if (!(array instanceof Array && array.length)) return [];
if (toString.call(cfg) !== "[object Object]") cfg = {};
if (typeof cfg.parser !== "function") cfg.parser = parse;
cfg.desc = !!cfg.desc ? -1 : 1;
return array.sort(function (a, b) {
a = getItem.call(cfg, a);
b = getItem.call(cfg, b);
return cfg.desc * (a < b ? -1 : +(a > b));
});
};
}());
var data = [
{date: "2011-11-14T16:30:43Z", quantity: 2, total: 90, tip: 0, type: "tab"},
{date: "2011-11-14T17:22:59Z", quantity: 2, total: 90, tip: 0, type: "Tab"},
{date: "2011-11-14T16:28:54Z", quantity: 1, total: 300, tip: 200, type: "visa"},
{date: "2011-11-14T16:53:41Z", quantity: 2, total: 90, tip: 0, type: "tab"},
{date: "2011-11-14T16:48:46Z", quantity: 2, total: 90, tip: 0, type: "tab"},
{date: "2011-11-14T17:25:45Z", quantity: 2, total: 200, tip: 0, type: "cash"},
{date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"},
{date: "2011-11-14T16:58:03Z", quantity: 2, total: 90, tip: 0, type: "tab"},
{date: "2011-11-14T16:20:19Z", quantity: 2, total: 190, tip: 100, type: "tab"},
{date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab"},
{date: "2011-11-14T17:07:21Z", quantity: 2, total: 90, tip: 0, type: "tab"},
{date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "Cash"}
];
Упорядочите массив "date"
как String
// sort by @date (ascending)
sortBy(data, { prop: "date" });
// expected: first element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }
// expected: last element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}
Если вы хотите игнорировать чувствительность к регистру, установите обратный вызов parser
:
// sort by @type (ascending) IGNORING case-sensitive
sortBy(data, {
prop: "type",
parser: (t) => t.toUpperCase()
});
// expected: first element
// { date: "2011-11-14T16:54:06Z", quantity: 1, total: 100, tip: 0, type: "Cash" }
// expected: last element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa" }
Если вы хотите преобразовать поле "date"
в качестве Date
типа:
// sort by @date (descending) AS Date object
sortBy(data, {
prop: "date",
desc: true,
parser: (d) => new Date(d)
});
// expected: first element
// { date: "2011-11-31T17:29:52Z", quantity: 1, total: 200, tip: 100, type: "Visa"}
// expected: last element
// { date: "2011-11-01T16:17:54Z", quantity: 2, total: 190, tip: 100, type: "tab" }
Здесь вы можете играть с кодом: jsbin.com/lesebi
Благодаря @Ozesh по его обратной связи проблема, связанная с свойствами с значениями falsy , была исправлена.
Простым способом решения этой проблемы является экспорт переменной среды PYTHONPATH
. Например, для Python 2.6 в Debian / GNU Linux:
export PYTHONPATH=/usr/lib/python2.6`
В других операционных системах вы сначала найдете местоположение этого модуля или файла socket.py
.
socket
- это модуль, содержащий класс socket
.
Вам нужно сделать socket.socket(...)
или from socket import socket
:
>>> import socket
>>> socket
<module 'socket' from 'C:\Python27\lib\socket.pyc'>
>>> socket.socket
<class 'socket._socketobject'>
>>>
>>> from socket import socket
>>> socket
<class 'socket._socketobject'>
Обратите внимание, что ошибка здесь довольно легко понять: если module object is not callable
, вы, вероятно, называете объект модуля! Что такое объект модуля? Это тот тип, который вы получаете при импорте модуля.
Но даже если вы этого не понимаете (это нормально, это часто путает, что классы, модули, функции и т. Д. - все это просто объекты, как все else), есть довольно простой способ начать отладку:
module object is not callable
. Похоже, я пытаюсь назвать то, что вы не можете назвать. Интересно, что я socket
. Это должно быть вызываемым! Интересно, является ли переменная socket
тем, что я думаю?` print socket
socket.socket
был немного запутанным. Я просто сделал import write_to_file
, а затем, так как метод, который я использовал внутри write_to_file.py
, назван writeToTextFile
, я просто rand write_to_file.writeToTextFile
– maudulus
30 July 2014 в 22:26
При настройке точки входа console_scripts в setup.py я обнаружил, что эта проблема существовала, когда конечная точка была модулем или пакетом, а не функцией внутри модуля.
Traceback (most recent call last):
File "/Users/ubuntu/.virtualenvs/virtualenv/bin/mycli", line 11, in <module>
load_entry_point('my-package', 'console_scripts', 'mycli')()
TypeError: 'module' object is not callable
Например
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule]
},
# ...
)
Должно быть
from setuptools import setup
setup (
# ...
entry_points = {
'console_scripts': [mycli=package.module.submodule:main]
},
# ...
)
Так, чтобы он ссылался на вызываемую функцию, а не на сам модуль. Кажется, не имеет значения, если модуль имеет блок if __name__ == '__main__':
. Это не сделает модуль доступным.
Похоже, что вы сделали импортированный модуль socket
как import socket
. Поэтому socket
является модулем. Вам также нужно изменить эту строку на self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
, а также на любое другое использование модуля socket
или изменить оператор импорта на from socket import socket
.
Или у вас есть import socket
после вашего from socket import *
:
>>> from socket import *
>>> serv = socket(AF_INET,SOCK_STREAM)
>>> import socket
>>> serv = socket(AF_INET,SOCK_STREAM)
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: 'module' object is not callable
import socket
, который импортирует модуль socket
, переопределяя класс socket
. См. Фрагмент кода в редакторе.
– marcog
26 December 2010 в 17:02
from <...> import *
импорта являются bad, bad, bad - это более или менее: обычно вы точно знаете, что находится в глобальном пространстве имен, потому что это именно то, что вы там положили. Но когда вы import *
, вы заполняете это пространство имен всеми видами вещей, которые определяют другие модули. В этом случае неясно, откуда взялось имя socket
- это модуль или что-то определенное в этом модуле? Если вы всегда i> используете import socket
или from socket import socket
, у вас никогда не будет этой проблемы, поскольку вы можете точно видеть, какие имена используются.
– Katriel
26 December 2010 в 17:06
Предположим, что содержимое YourClass.py:
class YourClass:
# ......
Если вы используете:
from YourClassParentDir import YourClass # means YourClass.py
Таким образом, я получил TypeError: 'module' object is если вы пытались использовать YourClass()
.
Но если вы используете:
from YourClassParentDir.YourClass import YourClass # means Class YourClass
или используете YourClass.YourClass()
, это работает для меня.
Я предполагаю, что вы переопределили встроенную функцию / переменную или что-то еще «модуль», установив глобальную переменную «module». просто распечатайте модуль, посмотрите, что в нем.
Вот еще один вопрос, который заставил меня некоторое время видеть даже после прочтения этих сообщений. Я настраивал скрипт для вызова моих сценариев bin python. Я также получал модуль, который нельзя вызывать.
Мой zig был в том, что я делал следующее:
from mypackage.bin import myscript
...
myscript(...)
, когда мне нужно было сделать следующее:
from mypackage.bin.myscript import myscript
...
myscript(...)
Итак, дважды проверьте свой пакет и вложенность модуля.
То, что я пытаюсь сделать, это иметь каталог скриптов, у которого нет расширения * .py, и все еще есть модули «bin» в mypackage / bin, и у них есть расширение * .py , Я новичок в упаковке и стараюсь следовать стандартам, поскольку я их интерпретирую. Итак, у меня есть корень установки:
setup.py
scripts/
script1
mypackage/
bin/
script1.py
subpackage1/
subpackage_etc/
Если это не соответствует стандарту, сообщите мне.
socket.py
. Что ж, это вызывало такое же сообщение об ошибке. Эта страница поставила меня на правильный путь: python-notes.curiousefficiency.org/en/latest/python_concepts/… – Czechnology 26 May 2016 в 22:04from .YourClass import YourClass
в файле__init__.py
? – Nicolas Seiller 2 April 2018 в 10:09