Verfasst: Donnerstag 18. September 2008, 20:39
Wo denn? Du hast doch schon wieder eine Fallunterscheidung drin (wobei ich das return nach dem if unübersichtlich finde! Ein explizites else ist da irgend wie schöner )
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
class Generic(object):
def get_dict(self):
"""Return a dictionary of given data, expects a list with tuples
For each tuple: Return first element as key and a tuple of remaining
elements as value.
Example:
In: [('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')]
Out: {'foo': ('bar', 'baz'), 'ham': ('egg', 'spam')}
Intended to ease access on user related data when setting tuples True.
"""
keys = (elem[0] for elem in self.data)
values = (elem[1:] for elem in self.data)
return dict((key, value) for key, value in izip(keys, values))
class Moods(Generic):
def __init__(self, data):
self.data = data
def prettify(self):
"""Return a human-readable string of all data"""
data = self.data
if type(data) is tuple:
string, time, mood = data
return '%s <%s>\n%s' % (string, time, mood)
s = []
for elem in data:
name, string, time, mood = elem
s.append('<%s> %s <%s>\n%s' % (name, string, time, mood))
return '\n\n'.join(s)
Code: Alles auswählen
datagetter = pyspace.Datagetter()
[dann der login...]
moods = datagetter.get_moods()
moods.get_dict()
Code: Alles auswählen
# ...
class Printer(object):
def printout(self):
print '...Printer prints something...'
class OtherPrinter(object):
def printout(self):
print '...OtherPrinter prints something else...'
class MessagePrinter(object):
def __init__(self, message):
self.message = message
def printout(self):
print '...MessagePrinter prints "%s"' % (message,)
# ...
object_list = [Printer(), OtherPrinter(), MessagePrinter('Hallo Welt'), Printer()]
for o in object_list:
o.printout()
Code: Alles auswählen
import pprint
def prettify(data):
return pprint.pformat(data)
def get_dict(data):
"""
>>> get_dict([('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')])
{'foo': ('bar', 'baz'), 'ham': ('egg', 'spam')}
"""
result = {}
for item in data:
result[item[0]] = item[1:]
return result
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=False)
d = get_dict([('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')])
print prettify(d) # oder gleich pprint.pprint(d) ;)
Gut, das ist ne ganze Ecke unkomplizierter, aber in der Klasse Generic funktioniert es trotzdem nicht. Den Sinn von pformat kann ich leider nicht erkennen:jens hat geschrieben:Code: Alles auswählen
def get_dict(data): """ >>> get_dict([('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')]) {'foo': ('bar', 'baz'), 'ham': ('egg', 'spam')} """ result = {} for item in data: result[item[0]] = item[1:] return result
Code: Alles auswählen
>>> print pprint.pformat([('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')])
[('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')]
Code: Alles auswählen
import pprint
daten = [
{"jo": (1,2,3),1:"jep",2:"foo",3:"mehr text...",4:"noch mehr text..."},
{"jo2": (1,2,3),1:"jep2",2:"foo",3:"mehr text...",4:"noch mehr text..."},
{"jo3": (1,2,3),1:"jep3",2:"foo",3:"mehr text...",4:"noch mehr text..."},
]
pprint.pprint(daten)
Code: Alles auswählen
[{1: 'jep',
2: 'foo',
3: 'mehr text...',
4: 'noch mehr text...',
'jo': (1, 2, 3)},
{1: 'jep2',
2: 'foo',
3: 'mehr text...',
4: 'noch mehr text...',
'jo2': (1, 2, 3)},
{1: 'jep3',
2: 'foo',
3: 'mehr text...',
4: 'noch mehr text...',
'jo3': (1, 2, 3)}]
Code: Alles auswählen
def get_dict(data):
result = {}
for item in data:
key = item[0]
if key in result:
raise AssertionError("Key %s ist doppelt!" % key)
result[key] = item[1:]
return result
Code: Alles auswählen
>>> class Generic(object):
def get_dict(self):
return '%s is a dict now' % self.data
>>> class Moods(Generic):
def __init__(self, data):
self.data = data
def prettify(self):
return '%s is pretty now' % self.data
>>> moods = Moods('bla')
>>> moods.prettify()
'bla is pretty now'
>>> moods.get_dict()
'bla is a dict now'
Code: Alles auswählen
class Generic(object):
def __init__(self, message):
self.message = message
self.something = 'awesome'
class MessagePrinter(Generic):
def __init__(self, message):
Generic.__init__(self, message)
def printout(self):
print 'MessagePrinter prints "%s". This is %s.' % (self.message, self.something)
Hab's genau so probiert aber es wird immer noch ein leeres Dict zurückgegeben.bwbg hat geschrieben:Die Attribute von Generic könntest du einfach an die Printer vererben:
Code: Alles auswählen
<Obelix> Wildschweine sind was feines <12:30 Uhr> gut gelaunt
<Haudraufwienix> ... <15:12 Uhr> fischig
<Gaius Bonus> Viel zu weit weg von Aquarium <11:45 Uhr> niedergeschlagen
<Marcus Schmalzlockus> ... <13:34 Uhr> aufgedreht
Code: Alles auswählen
[Im Dorf: ]<Obelix> Wildschweine sind was feines <12:30 Uhr> gut gelaunt
[Im Dorf: ]<Haudraufwienix> ... <15:12 Uhr> fischig
[Klein Bonum: ]<Gaius Bonus> Viel zu weit weg von Aquarium <11:45 Uhr> niedergeschlagen
[Klein Bonum: ]<Marcus Schmalzlockus> ... <13:34 Uhr> aufgedreht
Code: Alles auswählen
Mood (object)
-------------------------
name
text
time
mood
-------------------------
__init__(self, data : tuple) : None
__str__(self) : str
// returns a formated string with the objects data
Code: Alles auswählen
class Mood(object):
def __init__(self, data):
assert isinstance(data, tuple) and len(data) == 4
self.name = str(data[0])
self.text = str(data[1])
self.time = str(data[2])
selt.mood = str(data[3])
def __str__(self):
return '<%s> %s <%s>\n%s' % (self.name, self.text, self.time, self.mood)
Code: Alles auswählen
moods = []
while there_are_further_moods:
mood_tuple = get_next_tuple_with_mechanize()
moods.append(Mood(mood_tuple))
Code: Alles auswählen
for mood in moods:
print mood # ruft die __str__-Methode auf
Code: Alles auswählen
dg = DataGetter()
moods = dg.get_moods()
for mood in moods:
print mood
Ja, nur ist das ja später nicht mehr der Fall. Z.B. gibt es bei einem der Informationskästen von Myspace die Sparte Profil-Updates. Hier können ganz unterschiedliche Sachen stehen wie "x hat y als Freund hinzugefügt" oder "x wurde in diesem Foto verlinkt: (Anzeige des Fotos im Miniformat, ich würde in dem Fall die Bild-URL ausgeben)" oder "x hat ein neues Foto zum Album z hinzugefügt: (siehe oben)" usw. Es kann also nicht immer '<%s> %s <%s>\n%s' für die Anzeige gelten und auch die Anzahl der Tuples variiert von Fall zu Fall. Daher müsste IMHO bereits durch Datagetter.get_*() eine Liste mit Objekten eines Typs erzeugt werden, wobei jedem Objekt dann halt der eigentliche Datensatz des Freundes übergeben wird. Wenn dieses Objekt aber eine bestimmte __str__-Mehode enthält, würde ich ja immer eine Ausgabe nach dem jeweiligen Schema erhalten. So etwas wie:So wie ich das jetzt erkannt habe, werden eigentlich nur die Moods abgegriffen.
Code: Alles auswählen
moods = Generic(moods.get_moods()
print moods.get_data_by_name('Sven')
Code: Alles auswählen
class Information(object):
def __init__(self, friend):
self.friend = friend
def __str__(self):
return '<%s>' % (self.friend,)
class FriendAppend(Information):
def __init__(self, friend, who):
Information.__init__(self, friend)
self.who = who
def __str__(self):
return '<%s> added %s as a friend' % (self.friend, self.who)
class PhotoLink(Information):
def __init__(self, friend, url):
Information.__init__(self, friend)
self.url = url
def __str__(self):
return '<%s> was linked in this photo: %s' % (self.friend, self.url)
# ...
Code: Alles auswählen
def get_dict(data):
keys = (elem[0] for elem in data)
values = (elem[1:] for elem in data)
return dict((key, value) for key, value in izip(keys, values))
Code: Alles auswählen
def get_dict(data):
return dict((elem[0], elem[1:]) for elem in data)
Bisher habe ich es so verstanden, dass man damit Anwendungen in Myspace integrieren kann. Was ich will, ist ja eigentlich das genaue Gegenteil, nämlich Myspace insbesondere auf langsamen Rechnern nutzbar zu machen, indem ich es unabhängig vom Browser machee. Bei nem Kollegen baut sich die Seite bspw. extrem langsam auf, wegen den ganzen JavaScripts, blinkenden Werberfeldern usw. obwohl er im Prinzip nur mal schnell gucken will ob ein neuer Kommentar oder sowas da ist.Y0Gi hat geschrieben:Ohne genau mitgelesen zu haben: MySpace hat doch eine API. Kannst du damit vielleicht besser arbeiten?
Code: Alles auswählen
def get_dict(self):
"""Return a dictionary of given data, expects a list with tuples
For each tuple: Return first element as key and a tuple of remaining
elements as value.
Example:
In: [('foo', 'bar', 'baz'), ('ham', 'egg', 'spam')]
Out: {'foo': ('bar', 'baz'), 'ham': ('egg', 'spam')}
Intended to ease access on user related data.
"""
dic = {}
for elem in self.data:
key = elem[0]
if key in dic:
msg = u'Renamed duplicate of key name "%s" to "%s_doublet"' \
% (key, key)
warnings.warn(msg, category=DoubletKeyNameWarning)
key = key + '_doublet'
dic[key] = elem[1:]
return dic