P
Paul LaFollette
Kind people,
Using Python 3.0 on a Gatesware machine (XP).
I am building a class in which I want to constrain the types that can
be stored in various instance variables. For instance, I want to be
certain that self.loc contains an int. This is straightforward (as
long as I maintain the discipline of changing loc through a method
rather than just twiddling it directly.
def setLoc(lo):
assert isinstance(lo, int), "loc must be an int"
self.loc = lo
does the trick nicely.
However, I also want to constrain self.next to be either an instance
of class Node, or None. I would think that the following should work
but it doesn't.
def setNext(nxt):
assert isinstance(nxt, (Node, NoneType)), "next must be a Node"
self.next = nxt
since type(Node) responds with <class, 'NoneType'> but the assertion
above gives "name 'NoneType' is not defined" suggesting that NoneType
is some sort of quasi-class.
def setNext(nxt):
assert nxt==None or isinstance(nxt, Node), "next must be a Node"
self.next = nxt
works ok, but it's uglier than it ought to be.
So, I have three questions.
1) Why doesn't isinstance(nxt, (Node, NoneType)) work?
2) is their a less ugly alternative that what I am using?
3) (this is purely philosophical but I am curious) Would it not be
more intuitive if
isinstance(None, <anything at all>) returned true?
Thank you for your kind attention.
Paul
Using Python 3.0 on a Gatesware machine (XP).
I am building a class in which I want to constrain the types that can
be stored in various instance variables. For instance, I want to be
certain that self.loc contains an int. This is straightforward (as
long as I maintain the discipline of changing loc through a method
rather than just twiddling it directly.
def setLoc(lo):
assert isinstance(lo, int), "loc must be an int"
self.loc = lo
does the trick nicely.
However, I also want to constrain self.next to be either an instance
of class Node, or None. I would think that the following should work
but it doesn't.
def setNext(nxt):
assert isinstance(nxt, (Node, NoneType)), "next must be a Node"
self.next = nxt
since type(Node) responds with <class, 'NoneType'> but the assertion
above gives "name 'NoneType' is not defined" suggesting that NoneType
is some sort of quasi-class.
def setNext(nxt):
assert nxt==None or isinstance(nxt, Node), "next must be a Node"
self.next = nxt
works ok, but it's uglier than it ought to be.
So, I have three questions.
1) Why doesn't isinstance(nxt, (Node, NoneType)) work?
2) is their a less ugly alternative that what I am using?
3) (this is purely philosophical but I am curious) Would it not be
more intuitive if
isinstance(None, <anything at all>) returned true?
Thank you for your kind attention.
Paul