Как условно проверить, установлено ли значение объекта или равно кузнецу и отслеживать изменения?

Давайте возьмем один пример, предположим, что вы хотите установить usercontext (используя конструкцию флагов Local и LocalProxy).

Определить один класс пользователя:

class User(object):
    def __init__(self):
        self.userid = None

определить функцию для извлечения пользовательского объекта внутри текущего потока или greenlet

def get_user(_local):
    try:
        # get user object in current thread or greenlet
        return _local.user
    except AttributeError:
        # if user object is not set in current thread ,set empty user object 
       _local.user = User()
    return _local.user

Теперь определите LocalProxy

usercontext = LocalProxy(partial(get_user, Local()))

Теперь, чтобы получить идентификатор пользователя в текущем потоке usercontext.userid

:

1.Local имеет идентификатор и объект, тождество - это идентификатор threadid или greenlet, в этом примере _local.user = Пользователь () является эквивалентным для _local .___ storage __ [идентификатор текущего потока] ["user"] = User ()

  1. LocalProxy делегирует операцию завершению локального объекта или вы можете предоставить функцию, которая возвращает целевой объект. В приведенном выше примере функция get_user предоставляет текущий пользовательский объект LocalProxy, и когда вы запрашиваете идентификатор пользователя текущего пользователя usercontext.userid, функция __getattr__ LocalProxy сначала вызывает get_user для получения объекта пользователя (пользователя), а затем вызывает getattr (user, «userid»). чтобы установить userid в User (в текущем потоке или зеленетеле), вы просто выполните: usercontext.userid = "user_123"
2
задан Nicholas Carey 16 January 2019 в 23:10
поделиться

3 ответа

Эта функция будет сравнивать все свойства этих двух объектов одного типа. В функции takeAction он предпримет правильное действие. Вероятно, можно было бы сделать лучше, но я нахожу это более читабельным.

let a = { name : 'same', uri: 'samee', info: 'not same'};
const b = { name : 'same', uri: 'samee', info: 'same'};
areSame(a,b);
console.log(a, b);

function areSame(a,b){
  const aKeys = Object.keys(a);
  for(let key of aKeys){
    if(a[key] !== b[key]){
      // shouldUpdate = true;
      takeAction(a,b, key)
    } 
  }
}

function takeAction(a,b, key){
  switch(key){
    case "name": {
      a.name = b.name;
      document.write('name action taken');
      break;
    }
    case "uri": {
      // parse uri
      a.uri = b.uri;
      document.write('uri action taken');
      break;
    }
      
    case "info": {
        // activation: offer.activation,
        // image: offer.image
      document.write('info action taken');
      break;
    }
  }
}

0
ответ дан karoluS 16 January 2019 в 23:10
поделиться

Вы можете использовать Операторы короткого замыкания для преобразования назначений doc.uri и doc.info в:

doc.uri = doc.uri || () => {shouldUpdate = true; return encodeURI(offer.title)};
doc.info = doc.info || () => {shouldUpdate = true; return {
    activation: offer.activation,
    image: offer.image
}};
0
ответ дан MadWard 16 January 2019 в 23:10
поделиться

Вы можете сделать это еще хуже и использовать запятые, смотрите!

doc.name = doc.name === offer.title ? doc.name : (shouldUpdate = true, offer.title);
doc.uri = doc.uri || (shouldUpdate = true, encodeURI(offer.title));
doc.info = doc.info || (shouldUpdate = true, {
      activation: offer.activation,
      image: offer.image
});
0
ответ дан Blue 16 January 2019 в 23:10
поделиться
Другие вопросы по тегам:

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