Как правило, лучший подход, который я нашел, переопределяет __ilshift__
в качестве сеттера и __rlshift__
в качестве геттера, дублируется декоратором свойств. Это почти последний оператор, разрешаемый только (| & amp; ^), а логический - ниже. Он редко используется (__lrshift__
меньше, но его можно принимать во внимание).
В рамках использования пакета назначения PyPi можно управлять только прямым назначением, поэтому фактическая «сила» оператора ниже , PyPi присваивает пример пакета:
class Test:
def __init__(self, val, name):
self._val = val
self._name = name
self.named = False
def __assign__(self, other):
if hasattr(other, 'val'):
other = other.val
self.set(other)
return self
def __rassign__(self, other):
return self.get()
def set(self, val):
self._val = val
def get(self):
if self.named:
return self._name
return self._val
@property
def val(self):
return self._val
x = Test(1, 'x')
y = Test(2, 'y')
print('x.val =', x.val)
print('y.val =', y.val)
x = y
print('x.val =', x.val)
z: int = None
z = x
print('z =', z)
x = 3
y = x
print('y.val =', y.val)
y.val = 4
output:
x.val = 1
y.val = 2
x.val = 2
z = <__main__.Test object at 0x0000029209DFD978>
Traceback (most recent call last):
File "E:\packages\pyksp\pyksp\compiler2\simple_test2.py", line 44, in <module>
print('y.val =', y.val)
AttributeError: 'int' object has no attribute 'val'
То же самое со сдвигом:
class Test:
def __init__(self, val, name):
self._val = val
self._name = name
self.named = False
def __ilshift__(self, other):
if hasattr(other, 'val'):
other = other.val
self.set(other)
return self
def __rlshift__(self, other):
return self.get()
def set(self, val):
self._val = val
def get(self):
if self.named:
return self._name
return self._val
@property
def val(self):
return self._val
x = Test(1, 'x')
y = Test(2, 'y')
print('x.val =', x.val)
print('y.val =', y.val)
x <<= y
print('x.val =', x.val)
z: int = None
z <<= x
print('z =', z)
x <<= 3
y <<= x
print('y.val =', y.val)
y.val = 4
output:
x.val = 1
y.val = 2
x.val = 2
z = 2
y.val = 3
Traceback (most recent call last):
File "E:\packages\pyksp\pyksp\compiler2\simple_test.py", line 45, in <module>
y.val = 4
AttributeError: can't set attribute
Таким образом, оператор <<=
, получающий значение в свойстве, является гораздо более визуально чистым решением и не пытается заставить пользователя совершить некоторые отражающие ошибки, такие как:
var1.val = 1
var2.val = 2
# if we have to check type of input
var1.val = var2
# but it could be accendently typed worse,
# skipping the type-check:
var1.val = var2.val
# or much more worse:
somevar = var1 + var2
var1 += var2
# sic!
var1 = var2
Azure Согласие и разрешения:
Azure всегда заботится о доступе к организационным и пользовательским данным в приоритетном порядке. Согласие - это процесс предоставления пользователю разрешения на доступ к защищенным ресурсам от его имени. Администратора или пользователя могут попросить дать согласие на доступ к его организации / отдельным данным.
Подробнее о согласии пользователя
[118] можно получить здесь: [118]
. Пользователь должен сначала дать согласие клиентскому приложению. После получения согласия клиентское приложение сможет вызывать Microsoft Graph API от имени пользователя. Так что да, фреймворк сайта требует вышеуказанного разрешения. Подробнее о структуре согласия Azure Active Directory можно узнать здесь
.