Re: Simple Python class questions
Many thanks for the further comments: On Thu, 19 Jun 2008 21:24:31 -0400, Terry Reedy [EMAIL PROTECTED] wrote: def __init__(self): Try Import serial # the pyserial library The import should be at module level. You only want to do it once, not for every link. And if the import fails, you should find out right away. Yes I was wondering about that, but I wasn't clear about when 'body' code (ie not contained within a def block) in the module might run under Python. So it seemed to be safer to place the import statement inside the 'constructor' to get the earliest warning of non-visibility of pyserial. But you seem to be implying that the body code will run when the class is instantiated - have I understood that right? It surely doesn't run when the module containing the class is imported into the main module - does it?? It would certainly make life easier to place the import in the body of the module. I think that some of the other points hinge on the this one, so let me get my understanding straight on that first! I guess you learned by now why cut/paste/edit-down is superior to re-typing ;-) Well I know what you mean, but actually in this instance my Python environment is a non-networked laptop , so no easy way to cut and paste to a networked PC! (Actually the laptop does have an Ethernet chip in but bizarrely the driver somehow manages to kill my ADSL connection at the exchange or ISP, which takes hours to reset so I take care not to use this option. But learning Linux/Python is a useful role for this otherwise defunct PC) JGD -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
Yes I was wondering about that, but I wasn't clear about when 'body' code (ie not contained within a def block) in the module might run under Python. So it seemed to be safer to place the import statement inside the 'constructor' to get the earliest warning of non-visibility of pyserial. But you seem to be implying that the body code will run when the class is instantiated - have I understood that right? It surely doesn't run when the module containing the class is imported into the main module - does it?? It would certainly make life easier to place the import in the body of the module. Without insulting your intelligence I would advise looking at a few python tutorials, not so much for the programming technique, but rather how to think pythonic. A good one for using when coming from a previous programming language is Dive Into Python. http://www.diveintopython.org/ It does not deal with Serial specifically, but shows good examples of practises in Python. Might be of benefit to you, and is very easy and quick to read. :) -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
John Dann [EMAIL PROTECTED] wrote: Yes I was wondering about that, but I wasn't clear about when 'body' code (ie not contained within a def block) in the module might run under Python. So it seemed to be safer to place the import statement inside the 'constructor' to get the earliest warning of non-visibility of pyserial. But you seem to be implying that the body code will run when the class is instantiated - have I understood that right? It surely doesn't run when the module containing the class is imported into the main module - does it?? It would certainly make life easier to place the import in the body of the module. Python starts executing at the top of your main script and then proceeds line by line down until it falls off the bottom. Various things can divert it from this straightforward progression towards the end of the script, some of them such as if/for/while/raise or function calls are obvious, but the less obvious ones include: import somemodule (or 'from somemodule import something') if 'somemodule' has not previously been imported this will find the module and execute the lines of code in the module from top to bottom just as for the main script. When it falls off the bottom of the module it returns to the import statement, assigns the module or the imported attributes to a name or names in the calling namespace (yes, an import is just a highly specialised assignment statement), and then continues with the next statement. If somemodule has already started being imported anywhere in the program then the import simply returns immediately and does the assignment. (This can be a cause of confusion if you try to import modules recursively as it is perfectly possible that the imported module has not yet finished executing, so it may not yet have all the classes and functions you expect). class somename(bases): somecode A 'class' statement in Python is just executable code. The body of the class is executed from top to bottom but in a new namespace. When execution falls off the bottom of the class body a new class object is created from that namespace and the base classes. The new class object is then assigned to 'somename' (i.e. a class statement is a specialised assignment statement). Then execution then procedes with the next statement. def functionname(arg1, arg2=default): somecode A 'def' statement in Python is also a specialised assignment statement: unlike 'class' it doesn't immediately execute the code in the body, but it does evaluate any default argument values when it encounters the 'def'. Then it creates a new function object from the code in the body and the default arguments (and a few other things such as the argument specification and the function name). Then it continues with the next statement. global name The 'global' statement is not executed at runtime. It is the only Python statement which is purely compile time. Once you understand this it should be much clearer: everything except global is executed when it is encountered following the normal rules for program flow, and all the ways of creating module, classes, and functions simply execute some code and then do an assignment (and so if you wish you can later overwrite the values they assigned). If you wish to do something special when an import fails then you simply put try:..except: around the import at the top level in a module and handle it there: you don't need to put either the import or the handler inside a function. -- Duncan Booth http://kupuguy.blogspot.com -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
On Jun 19, 10:49 pm, Ulrich Eckhardt [EMAIL PROTECTED] wrote: Lie wrote: I think it's not that hard to see that it's just a pseudo code ...in comms.py I have: ... actually explicitly says that it is actual code from a file. *shrug* Uli I'm not sure how you think saying 'in comms.py I have:' is an explicit declaration that it is the very code in his comms.py, on contrary, he said: '...provide some outline code as an illustration: ', but let's stop polluting this thread. -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
In article [EMAIL PROTECTED], Lie [EMAIL PROTECTED] wrote: On Jun 19, 7:21 pm, Ulrich Eckhardt [EMAIL PROTECTED] wrote: John Dann wrote: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: class serial_link: def __init__(self): Try Import serial # the pyserial library Stop, this can't work. Other than VB, Python actually is case sensitive, so you must write 'try' and not 'Try' and also 'import' and not 'Import'. Further, many (all?) statements that cause an indention are usually terminated with a colon, so like with 'class ..:' and 'def ..:' you also must use 'try:' and not just 'try'. Fix all these and try again, I guess this will already help a lot. [...] Uli -- Sator Laser GmbH Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 I think it's not that hard to see that it's just a pseudo code I would have _thought_ it wasn't hard to see that if a person says he's totally new to the language, and even explicitly says that the problem could be syntax errors, then he shouldn't post pseudo code. How in the world is pseudo code going to allow people to help him fix his syntax? -- David C. Ullrich -- http://mail.python.org/mailman/listinfo/python-list
Simple Python class questions
A Python newbie, but some basic understanding of how classes, objects etc work in eg VB.Net. However, I'm struggling a little to translate this knowledge into the Python context. I'm trying to teach myself this aspect of Python by working up a trial project, part of which calls for pulling in data from a serial data connection at regular intervals. It looked sensible to place all the comms procedures/functions in their own class and module and make calls to those functions from an object instantiated in a main controlling module. But I'm struggling to get this working - not sure whether it's a fundamental misunderstanding of the use of classes in Python, syntax errors pure and simple or, most likely, a combination of both! Maybe I could provide some outline code as an illustration: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: class serial_link: def __init__(self): Try Import serial # the pyserial library Except ImportException #Error handling def openPort(self): Try #Code to try opening serial port Return Success Except SerialException Return Failure Then in my separate main calling module I might have: Import comms serlink=comms.seral_link #Create instance of serial_link class print serlink.openPort The last line I'm hoping would print Success or Failure. But I just seem to get some internal reference to the openPort function enclosed in . So why doesn't it work please? I may be making multiple errors here but as far as I can see the syntax seems right. For this particular example, I don't need to pass any arguments from the 'seriallink.openPort' function so haven't included any parentheses (or are they mandatory even if empty?) I could go on with the explanations etc, but it may be simplest to see if anyone can spot a howler straight out. TIA for anyone willing to help -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
Le Thursday 19 June 2008 13:54:03 John Dann, vous avez écrit : A Python newbie, but some basic understanding of how classes, objects etc work in eg VB.Net. However, I'm struggling a little to translate this knowledge into the Python context. Maybe I could provide some outline code as an illustration: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). No it's not :) It is recommended to always use new-style classes, and thus to give the object base explicitely : class serial_link (object) : ... see http://docs.python.org/ref/node33.html print serlink.openPort You just forgot the (), so you're printing the method object itself without calling it : print serlink.openPort() -- Cédric Lucantis -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
On Jun 19, 6:54 pm, John Dann [EMAIL PROTECTED] wrote: A Python newbie, but some basic understanding of how classes, objects etc work in eg VB.Net. However, I'm struggling a little to translate this knowledge into the Python context. I'm trying to teach myself this aspect of Python by working up a trial project, part of which calls for pulling in data from a serial data connection at regular intervals. It looked sensible to place all the comms procedures/functions in their own class and module and make calls to those functions from an object instantiated in a main controlling module. But I'm struggling to get this working - not sure whether it's a fundamental misunderstanding of the use of classes in Python, syntax errors pure and simple or, most likely, a combination of both! Maybe I could provide some outline code as an illustration: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: class serial_link: def __init__(self): Try Import serial # the pyserial library Except ImportException #Error handling def openPort(self): Try #Code to try opening serial port Return Success Except SerialException Return Failure Then in my separate main calling module I might have: Import comms serlink=comms.seral_link #Create instance of serial_link class print serlink.openPort The last line I'm hoping would print Success or Failure. But I just seem to get some internal reference to the openPort function enclosed in . So why doesn't it work please? I may be making multiple errors here but as far as I can see the syntax seems right. For this particular example, I don't need to pass any arguments from the 'seriallink.openPort' function so haven't included any parentheses (or are they mandatory even if empty?) I could go on with the explanations etc, but it may be simplest to see if anyone can spot a howler straight out. Yes they're mandatory even if there is no arguments, this is needed so python can differentiate between calling function and passing function objects. TIA for anyone willing to help -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
John Dann wrote: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: class serial_link: def __init__(self): Try Import serial # the pyserial library Stop, this can't work. Other than VB, Python actually is case sensitive, so you must write 'try' and not 'Try' and also 'import' and not 'Import'. Further, many (all?) statements that cause an indention are usually terminated with a colon, so like with 'class ..:' and 'def ..:' you also must use 'try:' and not just 'try'. Fix all these and try again, I guess this will already help a lot. One more thing: you are abusing exceptions. Typically, in such a short program you only have one try-except pair in the main entry function and all other code only throws the exceptions. In particular the __init__ function of a class should always signal errors using exceptions. However, this is not a strict yes/no question but rather a stylistic one. Uli -- Sator Laser GmbH Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
Many thanks for the speedy replies. On Thu, 19 Jun 2008 14:14:02 +0200, Cédric Lucantis [EMAIL PROTECTED] wrote: Le Thursday 19 June 2008 13:54:03 John Dann, vous avez écrit : Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). No it's not :) It is recommended to always use new-style classes, and thus to give the object base explicitely : class serial_link (object) : ... Can I just confirm: between the parentheses should be the literal 'object' - ie (object) - you're not just using 'object' as a placeholder where there should be a more specific class name or object? -- On Thu, 19 Jun 2008 14:21:46 +0200, Ulrich Eckhardt [EMAIL PROTECTED] wrote: Stop, this can't work. Other than VB, Python actually is case sensitive, so you must write 'try' and not 'Try' and also 'import' and not 'Import'. Further, many (all?) statements that cause an indention are usually terminated with a colon, so like with 'class ..:' and 'def ..:' you also must use 'try:' and not just 'try'. Fix all these and try again, I guess this will already help a lot. Sorry - the original code was syntactically correct - I just re-keyed it rather quickly for the original newsgroup post here, rather than copy/paste a larger chunk. I'll try to be more careful with any future posts. One more thing: you are abusing exceptions. Typically, in such a short program you only have one try-except pair in the main entry function and all other code only throws the exceptions. In particular the __init__ function of a class should always signal errors using exceptions. However, this is not a strict yes/no question but rather a stylistic one. Thanks - I need to think more clearly about the best way of doing this. JGD -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
Le Thursday 19 June 2008 15:13:39 John Dann, vous avez écrit : Many thanks for the speedy replies. On Thu, 19 Jun 2008 14:14:02 +0200, Cédric Lucantis [EMAIL PROTECTED] wrote: Le Thursday 19 June 2008 13:54:03 John Dann, vous avez écrit : Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). No it's not :) It is recommended to always use new-style classes, and thus to give the object base explicitely : class serial_link (object) : ... Can I just confirm: between the parentheses should be the literal 'object' - ie (object) - you're not just using 'object' as a placeholder where there should be a more specific class name or object? Right. 'object' is a builtin python class, used as a base for all classes as in many OO languages. -- Cédric Lucantis -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
On Jun 19, 7:21 pm, Ulrich Eckhardt [EMAIL PROTECTED] wrote: John Dann wrote: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: class serial_link: def __init__(self): Try Import serial # the pyserial library Stop, this can't work. Other than VB, Python actually is case sensitive, so you must write 'try' and not 'Try' and also 'import' and not 'Import'. Further, many (all?) statements that cause an indention are usually terminated with a colon, so like with 'class ..:' and 'def ..:' you also must use 'try:' and not just 'try'. Fix all these and try again, I guess this will already help a lot. One more thing: you are abusing exceptions. Typically, in such a short program you only have one try-except pair in the main entry function and all other code only throws the exceptions. In particular the __init__ function of a class should always signal errors using exceptions. However, this is not a strict yes/no question but rather a stylistic one. Uli -- Sator Laser GmbH Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 I think it's not that hard to see that it's just a pseudo code -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
Lie wrote: I think it's not that hard to see that it's just a pseudo code ...in comms.py I have: ... actually explicitly says that it is actual code from a file. *shrug* Uli -- Sator Laser GmbH Geschäftsführer: Thorsten Föcking, Amtsgericht Hamburg HR B62 932 -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple Python class questions
John Dann wrote: Let's say I define the class in a module called comms.py. The class isn't really going to inherit from any other class (except presumably in the most primitive base-class sense, which is presumably automatic and implicit in using the class keyword). Let's call the class serial_link. So in comms.py I have: If you on only ever going to have 1 serial link, you could put all functions in the module. But the class allows for multiple links in some future usage. class serial_link: Recommended for class names would be SerialLink, I believe (see PEP 8) but at least a cap for the initial letter of python-defined classes. def __init__(self): Try Import serial # the pyserial library Except ImportException #Error handling The import should be at module level. You only want to do it once, not for every link. And if the import fails, you should find out right away. You perhaps should move try/except into the importing module. Or re-raise the exception. Either way, the import of this module should fail if it cannot get serial. def openPort(self): Try #Code to try opening serial port Return Success Except SerialException Return Failure I would either move this to __init__ or call it from there (but the latter only if you expect to close and reopen ports. Then in my separate main calling module I might have: Import comms I guess you learned by now why cut/paste/edit-down is superior to re-typing ;-) serlink=comms.seral_link () #Create instance of serial_link class print serlink.openPort () Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list