Давайте возьмем один пример, предположим, что вы хотите установить 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 ()
Эта функция будет сравнивать все свойства этих двух объектов одного типа. В функции 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;
}
}
}
Вы можете использовать Операторы короткого замыкания для преобразования назначений 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
}};
Вы можете сделать это еще хуже и использовать запятые, смотрите!
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
});