Functional-style Datatypes In Python
Solution 1:
As sth indicated, your voice, place, and manner types are just enumerated types. There are a number of ways to implement those, such as
classvoice(object):
Voiced, Voiceless =range(2)
Then you can refer to voice.Voiced and voice.Voiceless, and so forth.
The problem is types like phoneme. In C the usual way to implement something like that would be to hold your nose and use a union. In something like python, you use polymorphism. First, figure out what operations you're going to perform on the phoneme type. Then, implement those operations as member functions of a Vowel class and a Consonant class. In C++ you'd make those member functions virtual and make an abstract base class for Vowel and Consonant; in python you can get away without doing that thanks to duck typing, although you might still find a base class to be useful.
So,
classVowel(object):
defSomeInitialMethod(self):
# ...classConsonant(object):
defSomeInitialMethod(self):
# ...
p.SomeInitialMethod() # p can be either vowel or consonantdefSomeLaterFunction(p)
# p is assumed to be either a Vowel or a Consonantifisinstance(p, Vowel):
# ...elifisinstance(p, Consonant):
# ...
Solution 2:
For the simple enumerations like voice
, place
and manner
you could use a class like this:
classEnum(object):
def__init__(self, *values):
self._values = set(values)
for value in values:
setattr(self, value, value)
def__iter__(self):
returniter(self._values)
place = Enum('Labial', 'Dental', 'Retroflex', 'Palatal', 'Velar', 'Glottal')
a = place.Retroflex
if a == place.Labial:
print"How did this happen?"for p in place:
print"possible value:", p
Solution 3:
You could create classes that contain the attributes you need.
classPhoneme:# ...classConsonant(Phoneme):def__init__(self, voice, place, manner):
self.voice = voice
self.place = place
self.manner = manner
# ...
h = Consonant('Voiceless', 'Glottal', 'Fricative')
# ...
Post a Comment for "Functional-style Datatypes In Python"