Python, создающий пользовательские перегруженные операторы [duplicate]

Вот некоторые подходы к работе с асинхронными запросами:
  1. Объект обезьяны браузера
  2. Q - A
  3. A + Promises.js
  4. jQuery отложен
  5. API XMLHttpRequest
  6. Использование концепции обратного вызова - как реализация в первом ответе

Пример: jQuery отложенная реализация для работы с несколькими запросами

var App = App || {};

App = {
    getDataFromServer: function(){

      var self = this,
                 deferred = $.Deferred(),
                 requests = [];

      requests.push($.getJSON('request/ajax/url/1'));
      requests.push($.getJSON('request/ajax/url/2'));

      $.when.apply(jQuery, requests).done(function(xhrResponse) {
        return deferred.resolve(xhrResponse.result);
      });
      return deferred;
    },

    init: function(){

        this.getDataFromServer().done(_.bind(function(resp1, resp2) {

           // Do the operations which you wanted to do when you
           // get a response from Ajax, for example, log response.
        }, this));
    }
};
App.init();
53
задан Garrett 3 February 2015 в 09:24
поделиться

6 ответов

Нет, вы не можете создавать новые операторы. Однако, если вы просто оцениваете выражения, вы можете сами обрабатывать строку и вычислять результаты новых операторов.

28
ответ дан Zifre 25 August 2018 в 17:50
поделиться

Хотя технически вы не можете определить новые операторы в Python, этот умный хак работает вокруг этого ограничения. Это позволяет вам определить такие операторы infix:

# simple multiplication
x=Infix(lambda x,y: x*y)
print 2 |x| 4
# => 8

# class checking
isa=Infix(lambda x,y: x.__class__==y.__class__)
print [1,2,3] |isa| []
print [1,2,3] <<isa>> []
# => True
149
ответ дан Ayman Hourieh 25 August 2018 в 17:50
поделиться

Sage предоставляет эту функциональность, по существу используя «умный взлом», описанный @Ayman Hourieh, но встроенный в модуль в качестве декоратора, чтобы обеспечить более чистый внешний вид и дополнительную функциональность - вы можете выбрать оператора для перегрузки и, следовательно, порядок

from sage.misc.decorators import infix_operator

@infix_operator('multiply')
def dot(a,b):
    return a.dot_product(b)
u=vector([1,2,3])
v=vector([5,4,3])
print(u *dot* v)
# => 22

@infix_operator('or')
def plus(x,y):
    return x*y
print(2 |plus| 4)
# => 6

Для получения дополнительной информации см. документацию Sage и этого билета отслеживания улучшений .

7
ответ дан billyjmc 25 August 2018 в 17:50
поделиться

Python 3.5 вводит символ @ для дополнительного оператора.

PEP465 ввел этот новый оператор для умножения матрицы, чтобы упростить обозначение многих числовых кодов. Оператор не будет реализован для всех типов, но только для объектов, подобных массивам.

Вы можете поддерживать оператор для своих классов / объектов, реализуя __matmul__().

PEP оставляет пространство для другого использования оператора для объектов, не относящихся к массивам.

Конечно, вы можете реализовать с @ любую операцию, отличную от матричного умножения, также для объектов, подобных массивам, но это повлияет на работу пользователя, потому что все будут ожидать, что ваш тип данных будет вести себя по-другому.

7
ответ дан gg349 25 August 2018 в 17:50
поделиться

Если вы намерены применить операцию к определенному классу объектов, вы можете просто переопределить оператор, который соответствует вашей функции, ближайший ... например, переопределение __eq__() переопределит оператор ==, чтобы вернуть все, что вы хотеть. Это работает практически для всех операторов.

8
ответ дан Sudhir Jonathan 25 August 2018 в 17:50
поделиться

Нет, Python поставляется с предопределенным, но переопределяемым набором функций .

37
ответ дан ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 25 August 2018 в 17:50
поделиться
Другие вопросы по тегам:

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