commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r5537 - in grc/branches/jblum_work: notes src src/Elem


From: jblum
Subject: [Commit-gnuradio] r5537 - in grc/branches/jblum_work: notes src src/Elements src/Graphics src/SignalBlockDefs
Date: Wed, 23 May 2007 15:09:40 -0600 (MDT)

Author: jblum
Date: 2007-05-23 15:09:39 -0600 (Wed, 23 May 2007)
New Revision: 5537

Modified:
   grc/branches/jblum_work/notes/notes.txt
   grc/branches/jblum_work/src/ActionHandler.py
   grc/branches/jblum_work/src/DataType.py
   grc/branches/jblum_work/src/Elements/Element.py
   grc/branches/jblum_work/src/Elements/SignalBlock.py
   grc/branches/jblum_work/src/FlowGraphApp.py
   grc/branches/jblum_work/src/Graphics/FlowGraph.py
   grc/branches/jblum_work/src/Messages.py
   grc/branches/jblum_work/src/SignalBlockDefs/Filters.py
   grc/branches/jblum_work/src/SignalBlockDefs/Sinks.py
   grc/branches/jblum_work/src/SignalBlockDefs/__init__.py
   grc/branches/jblum_work/src/Variables.py
Log:
split up importing of flow graph elements among modules, improved error 
messaging for importing flow graphs, added 2nd output socket to costas loop, 
removed useless error protections from the variable sink thread 

Modified: grc/branches/jblum_work/notes/notes.txt
===================================================================
--- grc/branches/jblum_work/notes/notes.txt     2007-05-23 16:14:25 UTC (rev 
5536)
+++ grc/branches/jblum_work/notes/notes.txt     2007-05-23 21:09:39 UTC (rev 
5537)
@@ -9,13 +9,13 @@
 -file save, ask for overwrite even when appending file extension
 -blocks need to fix themselves when they go out of bounds, like in a resize
 -socket controllers should be intelligent on shrinkage
+-the nested data variables should indicate that they are nested data -> 
variable_data
 
 ############   Features to Add:        ####################
 -save settings after close (working directory)
 -create sub-flow graphs to be used in larger flow graphs
 -math expressions, pi, e, sin, cos, tan, log, ln
 -stdin/out communication protocal (non graphical)
--make grc.xml parsers to match the dtd
 -include dtd in saved flow graphs
 -create dtd for preferences
 

Modified: grc/branches/jblum_work/src/ActionHandler.py
===================================================================
--- grc/branches/jblum_work/src/ActionHandler.py        2007-05-23 16:14:25 UTC 
(rev 5536)
+++ grc/branches/jblum_work/src/ActionHandler.py        2007-05-23 21:09:39 UTC 
(rev 5537)
@@ -152,8 +152,8 @@
                                        self.handle_states(NOTHING_SELECT)
                                        
Messages.send_start_load(self.flow_graph_file_path)
                                        initial_state = 
ParseXML.from_xml(ParseXML.from_file(self.flow_graph_file_path))
-                                       errors = 
self.flow_graph.from_nested_data(initial_state)
-                                       Messages.send_end_load(errors)
+                                       
self.flow_graph.from_nested_data(initial_state)
+                                       Messages.send_end_load()
                                        self.state_cache = 
StateCache(initial_state)
                                except Exception, e:    #if the data is bad, 
display error and call INIT with None for the file path    
                                        Messages.send_fail_load(e)

Modified: grc/branches/jblum_work/src/DataType.py
===================================================================
--- grc/branches/jblum_work/src/DataType.py     2007-05-23 16:14:25 UTC (rev 
5536)
+++ grc/branches/jblum_work/src/DataType.py     2007-05-23 21:09:39 UTC (rev 
5537)
@@ -234,7 +234,7 @@
                var_keys = list()
                for key in Variables.get_keys():
                        # use the key if we specified all variables or the key 
was not for a ranged variable
-                       if self.all_variables or Variables.get_values(key)[3] 
== '': var_keys.append(key)
+                       if self.all_variables or not Variables.is_ranged(key): 
var_keys.append(key)
                return var_keys 
                
 class Bool(Enum):

Modified: grc/branches/jblum_work/src/Elements/Element.py
===================================================================
--- grc/branches/jblum_work/src/Elements/Element.py     2007-05-23 16:14:25 UTC 
(rev 5536)
+++ grc/branches/jblum_work/src/Elements/Element.py     2007-05-23 21:09:39 UTC 
(rev 5537)
@@ -122,9 +122,7 @@
        def set_rotation(self, rotation):
                """     set the rotation        """
                if rotation not in POSSIBLE_ROTATIONS:
-                       print >>sys.stderr, 'Error: '+str(rotation)+' is not 
one of the \
-                       possible rotations: '+str(POSSIBLE_ROTATIONS)
-                       sys.exit(1)
+                       raise Exception('"%s" is not one of the possible 
rotations: (%s)'%(rotation,POSSIBLE_ROTATIONS))
                self.rotation = rotation                
                
        def update(self): 

Modified: grc/branches/jblum_work/src/Elements/SignalBlock.py
===================================================================
--- grc/branches/jblum_work/src/Elements/SignalBlock.py 2007-05-23 16:14:25 UTC 
(rev 5536)
+++ grc/branches/jblum_work/src/Elements/SignalBlock.py 2007-05-23 21:09:39 UTC 
(rev 5537)
@@ -156,4 +156,42 @@
                                                
sockets_list.remove(last_socket)                                        
                                        self.get_parent().update()      
#removing sockets could delete a connection, update all blocks
                
+##########################################################################
+##     Import a Signal Block
+##########################################################################
+       def from_nested_data(fg, nested_data, sb_constructor):
+               ''' Create a signal block from the nested data.
+                       Pass the flow graph/parent of the signal block,
+                       the nested data for a signal block, 
+                       and the contructor for the signal block.
+                       Return (the signal block, the runnable signal block) 
tuple.     '''
+               import ParseXML,Messages,SignalBlockDefs
+               find_data = ParseXML.find_data
+               signal_block = find_data([nested_data], 'signal_block')
+               tag = find_data(signal_block, 'tag')
+               id = find_data(signal_block, 'id')
+               #       These graphical parameters are optional and will 
default to 0 if not found      #
+               x_coordinate = find_data(signal_block, 'x_coordinate')
+               if x_coordinate == None: x_coordinate = 0
+               y_coordinate = find_data(signal_block, 'y_coordinate')
+               if y_coordinate == None: y_coordinate = 0
+               rotation = find_data(signal_block, 'rotation')
+               if rotation == None: rotation = 0
+               #       Load Parameters #
+               params = find_data(signal_block, 'params')
+               try:                    
+                       signal_block,runnable_signal_block = 
SignalBlockDefs.get_signal_block(
+                               fg, (int(x_coordinate),int(y_coordinate)), 
int(rotation), tag, id, sb_constructor,
+                       )
+                       for i,param in enumerate(params):
+                               try:
+                                       param = find_data([param], 'param')
+                                       
signal_block.get_params()[i].get_data_type().set_data(param)
+                               except: Messages.send_error_load('An invalid 
parameter was parsed, ignoring parameter "%d" in block "%s".'%(i, id))     
+                       return signal_block, runnable_signal_block              
+               except SignalBlockDefs.TagNotFoundException: 
+                       Messages.send_error_load('The definition for "%s" was 
not found, ignoring block "%s".'%(tag, id))
+               except Exception, e: Messages.send_error_load('Signal block 
"%s" could not be created:\n\t%s'%(id,e))   
+               return None, None       #not found!, return None tuple          
        
+       from_nested_data = staticmethod(from_nested_data)               
                        
\ No newline at end of file

Modified: grc/branches/jblum_work/src/FlowGraphApp.py
===================================================================
--- grc/branches/jblum_work/src/FlowGraphApp.py 2007-05-23 16:14:25 UTC (rev 
5536)
+++ grc/branches/jblum_work/src/FlowGraphApp.py 2007-05-23 21:09:39 UTC (rev 
5537)
@@ -26,6 +26,7 @@
 import ParseXML
 import Variables
 import SignalBlockDefs
+from Elements import SignalBlock
 from gnuradio import gr
 import wx
 import sys,os
@@ -192,20 +193,14 @@
                This code is partially copied from FlowGraph.py, with 
unnecessary code removed. """
                find_data = ParseXML.find_data
                flow_graph = find_data([nested_data], 'flow_graph')     
-               if find_data(flow_graph, 'valid') != str(True): raise 
Exception('Flow Graph did not pass validation!')
                vars = find_data(flow_graph, 'vars')
                signal_blocks = find_data(flow_graph, 'signal_blocks')
                connections = find_data(flow_graph, 'connections')
                len = 0
-               for var in vars:
-                       var = find_data([var], 'var')           
-                       key = find_data(var, 'key')
-                       value = find_data(var, 'value')
-                       min = find_data(var, 'min')
-                       max = find_data(var, 'max')
-                       step = find_data(var, 'step')
-                       Variables.register(key, value, min, max, step)
-                       if min != '' and max != '' and step != '':
+               keys = Variables.from_nested_data(vars)
+               for key in keys:
+                       value, min, max, step = Variables.get_values(key)       
                
+                       if Variables.is_ranged(key):
                                variable_control = VariableControl(self, key, 
self.parse_callbacks)
                                width = variable_control.get_slider_width()     
        
                                ###     Create a new row of sliders if the 
current row is full  ###
@@ -217,19 +212,13 @@
                                len = len + width       
                ################ done with sliders and variables 
#######################                
                signal_blocks_dict = dict()                             
-               for signal_block in signal_blocks:
-                       signal_block = find_data([signal_block], 'signal_block')
-                       tag = find_data(signal_block, 'tag')
-                       id = find_data(signal_block, 'id')
-                       params = find_data(signal_block, 'params')
-                       signal_block,runnable_signal_block = 
SignalBlockDefs.get_signal_block(None, (0,0), 0, tag, id)
+               for signal_block in signal_blocks:                      
+                       signal_block,runnable_signal_block = 
SignalBlock.from_nested_data(None, signal_block, SignalBlock)                   
   
                        data_type_params = list()
                        data_type_params.append(self)#put the flow graph thing 
here
-                       for i,param in enumerate(params):
-                               param = find_data([param], 'param')
-                               
signal_block.get_params()[i].get_data_type().set_data(param)
-                               
data_type_params.append(signal_block.get_params()[i].get_data_type())
-                       signal_blocks_dict[id] = 
runnable_signal_block(*data_type_params)
+                       for param in signal_block.get_params(): #load the list 
of arguments to the runnable block               
+                               data_type_params.append(param.get_data_type())  
                
+                       signal_blocks_dict[signal_block.get_id()] = 
runnable_signal_block(*data_type_params)
                for connection in connections:
                        connection = find_data([connection], 'connection')
                        input_signal_block_id = find_data(connection, 
'input_signal_block_id')

Modified: grc/branches/jblum_work/src/Graphics/FlowGraph.py
===================================================================
--- grc/branches/jblum_work/src/Graphics/FlowGraph.py   2007-05-23 16:14:25 UTC 
(rev 5536)
+++ grc/branches/jblum_work/src/Graphics/FlowGraph.py   2007-05-23 21:09:39 UTC 
(rev 5537)
@@ -39,6 +39,7 @@
 import Messages
 import Preferences
 import ParseXML
+import Messages
 
 class FlowGraph(gtk.DrawingArea):
        """     FlowGraph is the data structure to store graphical signal 
blocks, their graphical input/output
@@ -327,7 +328,12 @@
                        if self.mouse_pressed and self.selected_element != None:
                                self.selected_element.draw(self.pixmap)
                        self.window.draw_drawable(self.gc, self.pixmap, 0, 0, 
0, 0, -1, -1)      
-                                               
+
+##########################################################################
+##
+##                     Export the Flow Graph
+##
+##########################################################################     
                                        
        def to_nested_data(self):
                '''     Dump all the values in this flow graph into a nested 
data format.       '''
                vars_list = list()
@@ -344,7 +350,10 @@
                        ('vars', vars_list),
                        ('signal_blocks', signal_blocks_list),
                        ('connections', connections_list)
-               ])              
+               ])      
+       
##########################################################################
+       ##      Export the Variables
+       
##########################################################################      
                for key in self.variable_modification_window.to_key_list():
                        row = (key,) + Variables.get_values(key)
                        vars_list.append(('var', [
@@ -354,6 +363,9 @@
                                ('max', row[3]),
                                ('step', row[4]),
                        ]))
+       
##########################################################################
+       ##      Export the Signal Blocks
+       
##########################################################################
                for element in filter(Utils.is_signal_block, self.elements):
                        params_list = list()
                        signal_blocks_list.append(('signal_block', [
@@ -366,6 +378,9 @@
                        ]))
                        for param in element.get_params():
                                params_list.append(('param', 
str(param.get_data_type().get_data()))     )       
+       
##########################################################################
+       ##      Export the Connections
+       
##########################################################################
                for element in filter(Utils.is_connection, self.elements):
                        connections_list.append(('connection', [
                                ('input_signal_block_id', 
str(element.get_input_socket().get_parent().get_id())), 
@@ -375,53 +390,43 @@
                        ]))
                #print 'To',nested_data
                return nested_data
-               
+
+##########################################################################
+##     
+##                     Import the Flow Graph
+##
+##########################################################################     
        
        def from_nested_data(self, nested_data):
-               '''     Set all the values in this flow graph using the nested 
data.    '''
+               '''     Set all the values in this flow graph using the nested 
data.
+                       Return a string of errors, one error per line.  '''
                #print 'From',nested_data
-               errors = ''
                #TODO: use a non-destructive methode to clear the elements list
                self.elements = list()  #clear the elements
                find_data = ParseXML.find_data
                flow_graph = find_data([nested_data], 'flow_graph')
+               #       window width and height are optional    #
                window_width = find_data(flow_graph, 'window_width')
+               if window_width == None: window_width = MAX_WINDOW_WIDTH
                window_height = find_data(flow_graph, 'window_height')
+               if window_height == None: window_height = MAX_WINDOW_HEIGHT
                self.set_size_request(int(window_width),int(window_height))
                vars = find_data(flow_graph, 'vars')
                signal_blocks = find_data(flow_graph, 'signal_blocks')
                connections = find_data(flow_graph, 'connections')
-               Variables.clear_vars()
-               key_list = list()
-               for var in vars:
-                       var = find_data([var], 'var')                           
-                       key = find_data(var, 'key')
-                       value = find_data(var, 'value')
-                       min = find_data(var, 'min')
-                       max = find_data(var, 'max')
-                       step = find_data(var, 'step')
-                       Variables.register(key, value, min, max, step)
-                       key_list.append(key)
-               self.variable_modification_window.from_key_list(key_list)
+       
##########################################################################
+       ##      Import the Variables
+       
##########################################################################
+               keys = Variables.from_nested_data(vars)
+               self.variable_modification_window.from_key_list(keys)
+       
##########################################################################
+       ##      Import the Signal Blocks
+       
##########################################################################
                for signal_block in signal_blocks:
-                       signal_block = find_data([signal_block], 'signal_block')
-                       tag = find_data(signal_block, 'tag')
-                       id = find_data(signal_block, 'id')
-                       x_coordinate = int(find_data(signal_block, 
'x_coordinate'))
-                       y_coordinate = int(find_data(signal_block, 
'y_coordinate'))
-                       rotation = int(find_data(signal_block, 'rotation'))
-                       params = find_data(signal_block, 'params')
-                       try:                    
-                               signal_block = SignalBlockDefs.get_signal_block(
-                                       self, (x_coordinate,y_coordinate), 
rotation, tag, id, GraphicalSignalBlock
-                               )[0]
-                               for i,param in enumerate(params):
-                                       try:
-                                               param = find_data([param], 
'param')
-                                               
signal_block.get_params()[i].get_data_type().set_data(param)
-                                       except: errors = errors + 'An invalid 
parameter was parsed, ignoring parameter "%d" in block "%s".\n'%(i, id)         
  
-                               self.elements.append(signal_block)
-                       except SignalBlockDefs.TagNotFoundException: 
-                               errors = errors + 'The definition for "%s" was 
not found, ignoring block "%s".\n'%(tag, id)
+                       signal_block = 
GraphicalSignalBlock.from_nested_data(self, signal_block, 
GraphicalSignalBlock)[0]       #index 0 for just signal block  
+                       if signal_block: self.elements.append(signal_block)     
                
+       
##########################################################################
+       ##      Import the Connections
+       
##########################################################################
                for connection in connections:
                        connection = find_data([connection], 'connection')
                        input_signal_block_id = find_data(connection, 
'input_signal_block_id')
@@ -434,9 +439,9 @@
                                if element.get_id() == output_signal_block_id: 
output_socket = element.get_output_socket(output_socket_index)
                        try: self.elements.append(GraphicalConnection(self, 
input_socket, output_socket))
                        except (InvalidConnectionException, 
TooManyConnectionsException): 
-                               errors = errors + 'Could not connect "%s" 
input[%d] and "%s" output[%d].\n'%(
-                                       input_signal_block_id, 
input_socket_index, output_signal_block_id, output_socket_index)         
+                               Messages.send_error_load('Could not connect 
"%s" input[%d] and "%s" output[%d].'%(
+                                       input_signal_block_id, 
input_socket_index, output_signal_block_id, output_socket_index))        
                self.selected_element = None            
                self.update()
-               return errors
+               # done importing the flow graph #
 

Modified: grc/branches/jblum_work/src/Messages.py
===================================================================
--- grc/branches/jblum_work/src/Messages.py     2007-05-23 16:14:25 UTC (rev 
5536)
+++ grc/branches/jblum_work/src/Messages.py     2007-05-23 21:09:39 UTC (rev 
5537)
@@ -48,8 +48,10 @@
                                                        ------------------   
Loading Flow Graph   ------------------\n""")      
        send('Trying to load: "%s"'%file_path + '\n')
                                                        
-def send_end_load(errors):
-       if errors: send('>>>    Errors:\n%s'%errors)
+def send_error_load(error):
+       send('>>> Error: %s\n'%error)
+
+def send_end_load():
        send(">>> Done\n")
        
 def send_fail_load(error):

Modified: grc/branches/jblum_work/src/SignalBlockDefs/Filters.py
===================================================================
--- grc/branches/jblum_work/src/SignalBlockDefs/Filters.py      2007-05-23 
16:14:25 UTC (rev 5536)
+++ grc/branches/jblum_work/src/SignalBlockDefs/Filters.py      2007-05-23 
21:09:39 UTC (rev 5537)
@@ -313,12 +313,18 @@
 def CostasLoop(sb):
        fcn = gr.costas_loop_cc
        sb.add_input_socket('in', Complex())
-       sb.add_output_socket('out', Complex())
+       sb.add_output_socket('bout', Complex())
+       sb.add_output_socket('nout', Complex(), optional=True)
        sb.add_param('Alpha', Float())
        sb.add_param('Beta', Float())
        sb.add_param('Max Freq', Float())
        sb.add_param('Min Freq', Float())
        sb.add_param('Order', Enum([('2', 2), ('4', 4)]))
+       sb.set_docs('''\
+Carrier tracking PLL for QPSK input. \
+The Costas loop has two output streams: \
+"bout" is the baseband I stream, "nout" is the normalized frequency of the 
loop. \
+The "nout" may be left open. ''')
        return sb, lambda fg, *args: fcn(*map(lambda a: a.parse(), args))
        
 def ClockRecovery(sb):

Modified: grc/branches/jblum_work/src/SignalBlockDefs/Sinks.py
===================================================================
--- grc/branches/jblum_work/src/SignalBlockDefs/Sinks.py        2007-05-23 
16:14:25 UTC (rev 5536)
+++ grc/branches/jblum_work/src/SignalBlockDefs/Sinks.py        2007-05-23 
21:09:39 UTC (rev 5537)
@@ -96,11 +96,6 @@
                self.fg = fg
                self.var_key = var_key
                self.msgq = msgq
-               #       make sure that the variable exists and that it has no 
range     #
-               if not Variables.has_key(self.var_key):
-                       raise Exception('Error: variable "%s" does not 
exist!'%self.var_key)                    
-               elif Variables.get_values(self.var_key)[1] != '':
-                       raise Exception('Error: variable "%s" has a 
range!'%self.var_key)               
                threading.Thread.__init__(self)
                print 'Created variable sink thread for variable "%s"'%var_key
                                
@@ -117,21 +112,14 @@
                                # If so, we take only the last one
                                if nitems > 1:
                                        start = itemsize * (nitems - 1)
-                                       s = s[start:start+itemsize]
-                               
+                                       s = s[start:start+itemsize]             
                
                                #       parse the data to a complex or 
float/int string #
                                complex_data = Numeric.fromstring (s, 
Numeric.Float32)
                                if len(complex_data) == 2: new_value = "%f + 
%fj"%(complex_data[0], complex_data[1])
                                else: new_value = "%f"%(complex_data[0],) 
-                               
-                               old_value = Variables.get_value(self.var_key)
-                               # write the new value #                 
-                               try: 
-                                       Variables.unregister(self.var_key)
-                                       Variables.register(self.var_key, 
new_value)                             
-                               except: 
-                                       print "error registering"               
                                
-                                       Variables.register(self.var_key, 
old_value)     #error registering, restore variable
+                               # write the new value #         
+                               Variables.unregister(self.var_key)
+                               Variables.register(self.var_key, new_value)     
                        
                                #       parse the call backs    #               
                
                                self.fg.parse_callbacks()       
                        except: break                   

Modified: grc/branches/jblum_work/src/SignalBlockDefs/__init__.py
===================================================================
--- grc/branches/jblum_work/src/SignalBlockDefs/__init__.py     2007-05-23 
16:14:25 UTC (rev 5536)
+++ grc/branches/jblum_work/src/SignalBlockDefs/__init__.py     2007-05-23 
21:09:39 UTC (rev 5537)
@@ -23,4 +23,4 @@
 """
 
 from DataType import *
-from SignalBlockTree import SB_TREE,get_signal_block
+from SignalBlockTree import SB_TREE,get_signal_block,TagNotFoundException

Modified: grc/branches/jblum_work/src/Variables.py
===================================================================
--- grc/branches/jblum_work/src/Variables.py    2007-05-23 16:14:25 UTC (rev 
5536)
+++ grc/branches/jblum_work/src/Variables.py    2007-05-23 21:09:39 UTC (rev 
5537)
@@ -43,10 +43,6 @@
        Partially completed ranges will be intelligently filled in.
        Partially blanked ranges will be cleared.       
        All parameters must be strings! '''
-       #       if step is None, make it a blank string, for backwards 
compadibility    #
-       if step == None: step = ''
-       #       if min, max, and step are all None, make them blank strings #
-       if step == max == min == None: step = min = max = ''
        #       make sure that all parameters are strings #
        for var in (key, value, min, max, step):
                if type(var) != type(str()): raise TypeError('"%s" var is not 
of type string'%var)
@@ -105,6 +101,11 @@
        ''' Get the tuple for this key, otherwise None. '''
        if has_key(key): return VARS_DICT[key]
        else: return None
+       
+def is_ranged(key):
+       ''' Does this variable have a range:
+               min, max, and step are not blank.       '''
+       return get_values(key)[1] != ''
                
 def get_value(key):
        ''' Get the value for this key, otherwise None. '''
@@ -116,6 +117,43 @@
                with the string representation of the variable. '''
        for key in get_keys(): string = string.replace(VAR_MARKER + key, 
get_value(key))
        return string           
+
+##########################################################################
+##     Import the Variables
+##########################################################################     
+def from_nested_data(nested_data):
+       ''' Clear all of the registered variables,
+               and load all variables from nested data.        
+               Return a list of keys, in the order they were added.    '''
+       import ParseXML,Messages
+       find_data = ParseXML.find_data
+       clear_vars()
+       keys = list()
+       for var in nested_data:
+               var = find_data([var], 'var')                           
+               key = find_data(var, 'key')
+               value = find_data(var, 'value')
+               # min, max, and step are optional       #
+               min = find_data(var, 'min')
+               max = find_data(var, 'max')
+               step = find_data(var, 'step')           
+               #       if min, max, and step are all None, make them blank 
strings #
+               if step == max == min == None: step = min = max = ''    
+               #       if step is None, make it a blank string, for backwards 
compadibility    #
+               if step == None: step = ''              
+               try: 
+                       register(key, value, min, max, step)
+                       keys.append(key)
+               except Exception, e:  
+                       Messages.send_error_load('Could not register variable 
with: "%s, %s, %s, %s, %s":\n\t%s'%(key, value, min, max, step, e))
+                       try: 
+                               register(key, value)    #error!, register only 
the value
+                               keys.append(key)
+                       except Exception, e: 
+                               Messages.send_error_load('Could not register 
variable with: "%s, %s":\n\t%s'%(key, value, e))
+                               Messages.send_error_load('Variable "%s" not 
registered!'%key)
+                               pass    #dont register!         
+       return keys
        
 if __name__ == '__main__':
        print is_key_name_valid('sdfa13_fsf_dsd')               





reply via email to

[Prev in Thread] Current Thread [Next in Thread]