Path: csiph.com!usenet.pasdenom.info!news.redatomik.org!newsfeed.xs4all.nl!newsfeed1a.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'python.': 0.02; 'else:': 0.03; 'anyway.': 0.05; '"""': 0.07; 'convention.': 0.07; 'indices': 0.07; 'concern:': 0.09; 'exception.': 0.09; 'indexes': 0.09; 'logic': 0.09; 'received:80.91': 0.09; 'received:80.91.229': 0.09; 'received:gmane.org': 0.09; 'received:list': 0.09; 'subject:skip:f 10': 0.09; 'tmp': 0.09; 'python': 0.11; 'def': 0.12; '###': 0.16; '1):': 0.16; 'accesses': 0.16; 'ascending': 0.16; "chris'": 0.16; 'descending': 0.16; 'did.': 0.16; 'filename)': 0.16; 'filename):': 0.16; 'rarely': 0.16; 'received:80.91.229.3': 0.16; 'received:dip0.t-ipconnect.de': 0.16; 'received:plane.gmane.org': 0.16; 'received:t-ipconnect.de': 0.16; 'index': 0.16; 'wrote:': 0.18; 'file,': 0.19; 'implementing': 0.19; "python's": 0.19; 'skip:p 40': 0.19; 'later': 0.20; 'fit': 0.20; 'memory': 0.22; 'import': 0.22; 'header:User-Agent:1': 0.23; 'sorry,': 0.24; 'switched': 0.24; 'decide': 0.24; 'guys': 0.24; 'least': 0.26; 'defined': 0.27; 'values': 0.27; 'gets': 0.27; 'header:X-Complaints-To:1': 0.27; 'skip:p 30': 0.29; 'raise': 0.29; 'skip:g 30': 0.30; 'start,': 0.30; 'usually': 0.31; 'assert': 0.31; 'becoming': 0.31; 'index,': 0.31; 'way?': 0.31; 'yes.': 0.31; 'file': 0.32; 'class': 0.32; 'skip:m 30': 0.32; 'skip:_ 10': 0.34; 'subject:with': 0.35; 'but': 0.35; 'add': 0.35; 'false': 0.36; 'indexed': 0.36; 'sequence': 0.36; 'should': 0.36; 'step': 0.37; 'feed': 0.38; 'skip:[ 10': 0.38; 'to:addr:python-list': 0.38; 'to:addr:python.org': 0.39; 'changed': 0.39; 'received:org': 0.40; 'how': 0.40; 'read': 0.60; 'negative': 0.60; 'most': 0.60; 'skip:o 30': 0.61; 'no.': 0.61; 'first': 0.61; 'skip:n 10': 0.64; 'spot': 0.65; 'repeat': 0.74; 'done:': 0.84 X-Injected-Via-Gmane: http://gmane.org/ To: python-list@python.org From: Peter Otten <__peter__@web.de> Subject: Re: Step further with filebasedMessages Date: Tue, 05 May 2015 13:08:16 +0200 Organization: None References: <87oalzh0d5.fsf@Equus.decebal.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7Bit X-Gmane-NNTP-Posting-Host: p57bd817b.dip0.t-ipconnect.de User-Agent: KNode/4.13.3 X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.20+ Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 122 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1430824107 news.xs4all.nl 2886 [2001:888:2000:d::a6]:39657 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:89960 Cecil Westerhof wrote: > I now defined get_message_slice: > ### Add step > def get_message_slice(message_filename, start, end): Intervals are usually half-open in Python. I recommend that you follow that convention. > """ > Get a slice of messages, where 0 is the first message > Works with negative indexes > The values can be ascending and descending > """ > > message_list = [] > real_file = expanduser(message_filename) > nr_of_messages = get_nr_of_messages(real_file) > if start < 0: > start += nr_of_messages > if end < 0: > end += nr_of_messages > assert (start >= 0) and (start < nr_of_messages) You should raise an exception. While asserts are rarely switched off in Python you still have to be prepeared, and an IndexError would be a better fit anyway. > assert (end >= 0) and (end < nr_of_messages) > if start > end: > tmp = start > start = end > end = tmp > need_reverse = True > else: > need_reverse = False > with open(real_file, 'r') as f: > for message in islice(f, start, end + 1): > message_list.append(message.rstrip()) > if need_reverse: > message_list.reverse() > return message_list > > Is that a good way? > > I also had: > def get_indexed_message(message_filename, index): > """ > Get index message from a file, where 0 gets the first message > A negative index gets messages indexed from the end of the file > Use get_nr_of_messages to get the number of messages in the file > """ > > real_file = expanduser(message_filename) > nr_of_messages = get_nr_of_messages(real_file) > if index < 0: > index += nr_of_messages > assert (index >= 0) and (index < nr_of_messages) > with open(real_file, 'r') as f: > [line] = islice(f, index, index + 1) > return line.rstrip() > > But changed it to: > def get_indexed_message(message_filename, index): > """ > Get index message from a file, where 0 gets the first message > A negative index gets messages indexed from the end of the file > Use get_nr_of_messages to get the number of messages in the file > """ > > return get_message_slice(message_filename, index, index)[0] > > Is that acceptable? Yes. > I am a proponent of DRY. But note that you are implementing parts of the slicing logic that Python's sequence already has. Consider becoming a pronent of DRWTOGAD*. > Or should I at least keep the assert in it? No. I see you have a tendency to overengineer. Here's how I would approach case (1) in Chris' answer, where memory is not a concern: import os def read_messages(filename): with open(os.path.expanduser(filename)) as f: return [line.rstrip() for line in f] # get_messages_slice(filename, start, end) print(read_messages(filename)[start:end+1]) # get_indexed_message(filename, index) print(read_messages(filename)[index]) Should you later decide that a database is a better fit you can change read_messages() to return a class that transparently accesses that database. Again, most of the work is already done: class Messages(collections.Sequence): def __init__(self, filename): self.filename = filename) def __getitem__(self, index): # read record(s) from db def __len__(self): # return num-records in db def read_messages(filename): return Messages(filename) By the way, where do you plan to use your functions? And where do the indices you feed them come from? (*) Don't repeat what those other guys already did. Yeah sorry, I have a soft spot for lame jokes...