python 'module' - для png плит из моей папки [duplicate]

Я рекомендую 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 , была исправлена.

382
задан Nicholas Knight 27 March 2011 в 05:52
поделиться

8 ответов

Простым способом решения этой проблемы является экспорт переменной среды PYTHONPATH. Например, для Python 2.6 в Debian / GNU Linux:

export PYTHONPATH=/usr/lib/python2.6`

В других операционных системах вы сначала найдете местоположение этого модуля или файла socket.py.

73
ответ дан fragilewindows 21 August 2018 в 21:29
поделиться
  • 1
    Интересно - я не знаю, увидит ли это ОП, но стоит попробовать! – David Robinson 13 January 2012 в 08:08
  • 2
    Это определенно стоит отметить. Я просто пытался быстро проверить сокеты, поэтому я просто назвал файл socket.py. Что ж, это вызывало такое же сообщение об ошибке. Эта страница поставила меня на правильный путь: python-notes.curiousefficiency.org/en/latest/python_concepts/… – Czechnology 26 May 2016 в 22:04
  • 3
    Это просто безупречно работает на Python 3.6 :) – mrGreenBrown 21 February 2017 в 11:05
  • 4
    Разве это не должно быть from .YourClass import YourClass в файле __init__.py? – Nicolas Seiller 2 April 2018 в 10:09

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
406
ответ дан Katriel 21 August 2018 в 21:29
поделиться
  • 1
    Я в настоящее время imporitng сокет следующим образом: from socket import * – user551717 26 December 2010 в 17:06
  • 2
    Я также изменил его на сокет сокета импорта, и я все равно получаю ту же ошибку. – user551717 26 December 2010 в 17:07
  • 3
    @ Милиметрический reload(module) – Katriel 6 July 2012 в 15:46
  • 4
    О, я понимаю. socket.socket был немного запутанным. Я просто сделал import write_to_file, а затем, так как метод, который я использовал внутри write_to_file.py, назван writeToTextFile, я просто rand write_to_file.writeToTextFile – maudulus 30 July 2014 в 22:26
  • 5
    Стоит отметить, что это было не очевидно, по крайней мере, для 133 человек, которые занимали время, чтобы голосовать (включая меня), которые этого не понимали. Теперь это очевидно, и в следующий раз, когда я дойду до своего инструментария, я найду этот инструмент, когда модуль будет объявлен как «не вызываемый». Начало работы с новым языком - самая сложная часть. – jmort253 27 September 2014 в 22:04

При настройке точки входа 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__':. Это не сделает модуль доступным.

0
ответ дан Luke Exton 21 August 2018 в 21:29
поделиться

Похоже, что вы сделали импортированный модуль 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
19
ответ дан marcog 21 August 2018 в 21:29
поделиться
  • 1
    Я импортировал сокет как: из импорта сокета * Я могу его изменить, но это займет некоторое время, поэтому я неохотно. – user551717 26 December 2010 в 17:00
  • 2
    @user. Вы, вероятно, позже получили файл import socket, который импортирует модуль socket, переопределяя класс socket. См. Фрагмент кода в редакторе. – marcog 26 December 2010 в 17:02
  • 3
    @user: вы должны изменить его. Причиной from <...> import * импорта являются bad, bad, bad - это более или менее: обычно вы точно знаете, что находится в глобальном пространстве имен, потому что это именно то, что вы там положили. Но когда вы import *, вы заполняете это пространство имен всеми видами вещей, которые определяют другие модули. В этом случае неясно, откуда взялось имя socket - это модуль или что-то определенное в этом модуле? Если вы всегда используете import socket или from socket import socket, у вас никогда не будет этой проблемы, поскольку вы можете точно видеть, какие имена используются. – Katriel 26 December 2010 в 17:06
  • 4
    Хорошо. Спасибо за совет. Я только что получил привычку из многих учебников. – user551717 26 December 2010 в 17:17

Предположим, что содержимое 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(), это работает для меня.

60
ответ дан Martijn Pieters 21 August 2018 в 21:29
поделиться

Я предполагаю, что вы переопределили встроенную функцию / переменную или что-то еще «модуль», установив глобальную переменную «module». просто распечатайте модуль, посмотрите, что в нем.

0
ответ дан umairhhhs 21 August 2018 в 21:29
поделиться

Вот еще один вопрос, который заставил меня некоторое время видеть даже после прочтения этих сообщений. Я настраивал скрипт для вызова моих сценариев 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/

Если это не соответствует стандарту, сообщите мне.

25
ответ дан zerocog 21 August 2018 в 21:29
поделиться
79
ответ дан fragilewindows 4 November 2018 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: