Как изменить способ печати функции? [Дубликат]

Следуя ответу Даниэля Вассалло , вот версия, которая имеет дело с проблемой замыкания более простым способом.

Так как все маркеры будут иметь отдельный InfoWindow , и поскольку JavaScript не волнует, добавили ли вы дополнительные свойства к объекту, все, что вам нужно сделать, это добавить InfoWindow в свойства [] маркера , а затем вызвать .open() на InfoWindow от себя!

Редактирование: при наличии достаточного количества данных, pageload может занимать много времени, поэтому вместо создания InfoWindow с маркером конструкция должна произойти только тогда, когда это необходимо. Обратите внимание, что любые данные, используемые для создания InfoWindow , должны быть добавлены к маркеру как свойство (data). Также обратите внимание, что после первого события клика infoWindow будет сохраняться как свойство его маркера, поэтому браузеру не нужно постоянно восстанавливать.

var locations = [
  ['Bondi Beach', -33.890542, 151.274856, 4],
  ['Coogee Beach', -33.923036, 151.259052, 5],
  ['Cronulla Beach', -34.028249, 151.157507, 3],
  ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
  ['Maroubra Beach', -33.950198, 151.259302, 1]
];

var map = new google.maps.Map(document.getElementById('map'), {
  center: new google.maps.LatLng(-33.92, 151.25)
});

for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    data: {
      name: locations[i][0]
    }
  });
  marker.addListener('click', function() {
    if(!this.infoWindow) {
      this.infoWindow = new google.maps.InfoWindow({
        content: this.data.name;
      });
    }
    this.infoWindow.open(map,this);
  })
}

14
задан beardc 4 June 2012 в 02:36
поделиться

3 ответа

Да, если вы хотите отказаться от функции, фактически являющейся функцией.

Сначала определите класс для нашего нового типа:

import functools
class reprwrapper(object):
    def __init__(self, repr, func):
        self._repr = repr
        self._func = func
        functools.update_wrapper(self, func)
    def __call__(self, *args, **kw):
        return self._func(*args, **kw)
    def __repr__(self):
        return self._repr(self._func)

Добавьте в декоратор function:

def withrepr(reprfun):
    def _wrap(func):
        return reprwrapper(reprfun, func)
    return _wrap

И теперь мы можем определить репер вместе с функцией:

@withrepr(lambda x: "<Func: %s>" % x.__name__)
def mul42(y):
    return y*42

Теперь repr(mul42) создает '<Func: mul42>'

16
ответ дан kwatford 28 August 2018 в 00:08
поделиться

Нет, потому что repr(f) выполняется как type(f).__repr__(f).

6
ответ дан JBernardo 28 August 2018 в 00:08
поделиться

Для этого вам нужно будет изменить функцию __repr__ для данного класса, которая в этом случае является встроенным классом функций (types.FunctionType). Поскольку в Python вы не можете редактировать встроенные классы, только подклассировать их, вы не можете.

Однако есть два подхода, которым вы могли бы следовать:

  1. Обернуть некоторые функции в виде kwatford Предлагаемый
  2. Создайте свой собственный протокол представления с помощью собственной функции воспроизведения. Например, вы можете определить функцию myrepr, которая сначала ищет методы __myrepr__, которую вы не можете добавить в класс функций, но вы можете добавить ее к отдельным объектам функции, как вы предлагаете (а также к вашим пользовательским классам и объектам) , затем по умолчанию будет указано, если __myrepr__ не найден. Возможная реализация для этого будет:
    def myrepr(x):
      try:
        x.__myrepr__
      except AttributeError:
        return repr(x)
      else:
        return x.__myrepr__()
    
    Затем вы можете определить методы __myrepr__ и использовать функцию myrepr. Кроме того, вы также можете __builtins__.repr = myrepr сделать свою функцию по умолчанию repr и продолжать использовать repr. Этот подход в конечном итоге сделает именно то, что вы хотите, хотя редактирование __builtins__ может не всегда быть желательным.
3
ответ дан Sean Allred 28 August 2018 в 00:08
поделиться
Другие вопросы по тегам:

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