2015-01-26 5 views
1

Я просматриваю все черты в большой программе, и многие из наших черт синхронизированы. Например, рассмотрим HasTrait объекты структуры:Осмотрите на синхронизированные черты: Traits/TraitsUI

a = Material1.ShellMaterial 
b = Material2.CoreMaterial 
c = Material3.MaterialX 

В нашем приложении, то получается, что и с синхронизируются черты. Другими словами, Material3.MaterialX совпадает с Material1.ShellMaterial, и они установили с использованием sync_trait()(HasTraits API).

Возможно ли проверять a, b, c и динамически определять, что a и c синхронизированы?

Целью является построение всех этих объектов, но скрытие избыточных участков от пользователя. Типичные сравнения между ними, такие как a==c, возвращают False, несмотря на то, что эти объекты представляют одни и те же данные.

+0

Попробуйте изменить один из них (и сменить его обратно), чтобы увидеть, изменился ли соответствующий. Это то, что попробовал бы мой новичок. – user3391229

ответ

1

Насколько я знаю, нет официального API, который позволяет проверять состояние синхронизации признаков.

Конечно, вы можете просто вызвать метод sync_trait() еще раз, чтобы убедиться, что черты синхронизированы (или не синхронизированы, если вы используете remove=True). В результате вы узнаете состояние синхронизации признаков.

Если вы не хотите изменять состояние синхронизации, вам необходимо полагаться на неофициальные функции API, которые не документированы и могут быть изменены, поэтому используйте их на свой страх и риск.

from traits.api import HasTraits, Float 
class AA(HasTraits): 
    a =Float() 
class BB(HasTraits): 
    b = Float() 
aa = AA() 
bb = BB() 
aa.sync_trait("a", bb, "b") 

# aa.a and bb.b are synchronized 
# Now we use non-official API functions 
info = aa._get_sync_trait_info() 

synced = info.has_key("a") # True if aa.a is synchronized to some other trait 
if synced: 
    sync_info = info["a"] # fails if a is not a synchronized trait 
    # sync_info is a dictionary which maps (id(bb),"b") to a tuple (wr, "b") 
    # If you do not know the id() of the HasTraits-object and the name of 
    # the trait, you have to loop through all elements of sync_info and 
    # search for the entry you want... 
    wr, name = sync_info[(id(bb), "b")] 
    # wr is a weakref to the class of bb, and name is the name 
    # of the trait which aa.a is synced to 
    cls = wr() # <__main__.BB at 0x6923a98> 

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

+0

Спасибо, человек, оцените усилия, чтобы ответить на поиски после всего этого времени. –

Смежные вопросы