@@ -86,7 +86,10 @@ def add_device_property(self, settings):
8686 Parameters
8787 ----------
8888 settings : dict
89- dict containing settings for property. Must have the key "values", "range", or "indexed_values".
89+ dict containing settings for property. Must have:
90+ - the key "values", "range", or "indexed_values", or "dict_values"
91+ - "write_string" and/or "query_string" to communication with instrument
92+ - "return_type" is a function that converts the return string to a python type
9093
9194 Returns
9295 -------
@@ -95,6 +98,16 @@ def add_device_property(self, settings):
9598
9699 self ['_{}_settings' .format (settings ['name' ])] = settings
97100
101+ command_strings = ['write_string' , 'query_string' ]
102+ if not any (string in settings for string in command_strings ):
103+ assert False , "'write_string' and/or 'query_string' must be in settings"
104+
105+ # read_only properties do not need to have a required key in setting,
106+ # but for the docstring to work a read_only property is created.
107+ if 'write_string' not in settings :
108+ if 'read_only' not in settings :
109+ settings ['read_only' ] = settings ['return_type' ].__name__
110+
98111 prop_type = ''
99112 if 'values' in settings :
100113 set_function = self .set_values_property
@@ -110,16 +123,32 @@ def add_device_property(self, settings):
110123 elif 'dict_values' in settings :
111124 set_function = self .set_dict_values_property
112125 prop_type = 'dict_values'
126+ elif 'read_only' in settings :
127+ prop_type = 'read_only'
113128 else :
114- assert False , "key used but not allowed "
129+ assert False , "Key 'values', 'range', indexed_values', 'read_only', or 'dict_values' must be in settings. "
115130
116131 doc_string = "{} : {}\n {}: {}" .format (settings ['name' ], settings ['return_type' ].__name__ ,
117132 prop_type , settings [prop_type ])
118133
119- property_definition = property (
120- fget = lambda obj : self .get_instrument_property (obj , settings ),
121- fset = lambda obj , new_value : set_function (obj , new_value , settings ),
122- doc = doc_string )
134+ # read-only
135+ if 'write_string' not in settings :
136+ property_definition = property (
137+ fget = lambda obj : self .get_instrument_property (obj , settings ),
138+ fset = None ,
139+ doc = doc_string )
140+ # write-only
141+ elif 'query_string' not in settings :
142+ property_definition = property (
143+ fget = None ,
144+ fset = lambda obj , new_value : set_function (obj , new_value , settings ),
145+ doc = doc_string )
146+ else :
147+ property_definition = property (
148+ fget = lambda obj : self .get_instrument_property (obj , settings ),
149+ fset = lambda obj , new_value : set_function (obj , new_value , settings ),
150+ doc = doc_string ,
151+ )
123152
124153 setattr (self .__class__ , settings ['name' ], property_definition )
125154
0 commit comments