From: Brandon McCombs on
Ulrich Eckhardt wrote:
> Brandon McCombs wrote:
>> I'm building an elevator simulator for a class assignment. I recently
>> ran into a roadblock and don't know how to fix it. For some reason, in
>> my checkQueue function below, the call to self.goUp() is never executed.
> [...]
>> sorry about the formatting
>
> While I can certainly forgive you the formatting (my problem is rather that
> you didn't reduce the code to the smallest possible example

so I missed a few lines, so sue me.

), Python wont.
> Python is a language where whitespace is significant and can subtly change
> the meaning of your code.
>
> Example:
>
>> for i in range(0,self.newPassengers):
>> self.passengerList.append(self.passengerWaitQ.pop())
>> self.goUp()
>
> The formatting here is completely removed, but there are two conceivable
> ways this could be formatted:

already aware. I reformatted tabs to reduce the line wrap so it was
easier for readers to read it.

>
> # variant 1
> for i in range(0,self.newPassengers):
> self.passengerList.append(self.passengerWaitQ.pop())
> self.goUp()
>
> #variant 2
> for i in range(0,self.newPassengers):
> self.passengerList.append(self.passengerWaitQ.pop())
> self.goUp()

either one of those should still execute self.goUp(). I'm not getting
anything though no matter where I place the function call.

>
> Someone already mentioned PEP 8 (search the web!). These PEPs could be
> called the standards governing Python behaviour, and PEP 8 actually defines
> several things concerning the formatting of sourcecode. Apply it unless you
> have a good reason not to.
>
>
> Further, you should run Python with "-t" as argument on the commandline.
> This will give you warnings when it encounters inconsistent tab/spaces
> usage. This can make a difference.

Yeah I already tried that using 'tabnanny' I think it was called to
diagnose one function that I decided to create and the -t option gave me
false information. I determined that I had a tab in front of the
function name (just like many others) however the actual fix was to put
in spaces until it lined up with all the other 'def' lines.

>
> Example:
>
> #variant 3
> for i in range(0,self.newPassengers):
> self.passengerList.append(self.passengerWaitQ.pop())
> <TAB>self.goUp()
>
> If your editor is set to four spaces per tab, this will look like variant 2,
> with 8 spaces it will look like variant 1. I don't know (and don't care,
> since PEP-8 mandates four spaces) which interpretation Python actually
> uses.
>
>
> Lastly, you can simplify your check_queue() function. First, determine the
> number of free places inside the elevator. Then, you simply append that
> many passengers from the waiting list to the passenger list:
>
> free = MAX_CAPACITY - len(self.passengers)
> new_passengers = self.passenger_wait_queue[:free]
> self.passenger_wait_queue = self.passenger_wait_queue[free:]
> self.passengers += new_passengers
>
> This uses the fact that list indices are automatically truncated to a valid
> range, so requesting the elements 0 to 10 from a 5-element list will only
> yield those five elements, not raise an exception. It's up to you though
> which version is clearer to you. I would perhaps bail out if "free == 0"
> and then also not call go_up() lateron.
>
>

so you made other recommendations but didn't address my original
question unless I missed it somewhere.
From: Tommy Grav on

On Aug 5, 2010, at 11:20 AM, Brandon McCombs wrote:
> so I missed a few lines, so sue me.

The problem is that when you don't post a self contained example
there is no proper way to answer your question, since the problem
could be outside the part you posted.

> already aware. I reformatted tabs to reduce the line wrap so it was easier for readers to read it.

Never format code after you copy-paste it to your browser. This
may change the behavior of your example making it impossible for
people to help you.

> either one of those should still execute self.goUp(). I'm not getting anything though no matter where I place the function call.

Like someone said before. Try to create the smallest subset of your code
that shows this behavior and copy-paste it to the list and people will
try to help. Right now there is no clear answer from what you posted.

Tommy

From: Neil Cerutti on
On 2010-08-05, Brandon McCombs <none(a)none.com> wrote:
> class Elevator(Process):
> def __init__(self,name):
> Process.__init__(self,name=name)
> self.numPassengers = 0
> self.passengerList = []
> self.passengerWaitQ = []
> self.currentFloor = 1
> self.idle = 1
> self.newPassengers = 0
> def goUp(self):
> print "here"
> bubbleSort(self.passengerList, len(self.passengerList))
> self.currentFloor += 1
> if len(self.passengerList) > 0:
> for p in self.passengerList:
> if self.currentFloor == p.destination:
> yield (p.destination - self.currenteFloor) * TRAVELTIME, self
> reactivate(p)
> p.inBuilding()
> else:
> self.goUp()
>
> def checkQueue(self):
> if (len(self.passengerWaitQ)) > 0 and len(self.passengerList) <
> MAXCAPACITY:
> if len(self.passengerWaitQ) < MAXCAPACITY:
> self.newPassengers = len(self.passengerWaitQ)
> else:
> self.newPassengers = MAXCAPACITY - len(self.passengerList)
> for i in range(0,self.newPassengers):
> self.passengerList.append(self.passengerWaitQ.pop())
> self.goUp()


Does your program call checkQueue?

--
Neil Cerutti
From: Daniel Urban on
> I'm building an elevator simulator for a class assignment. I recently ran
> into a roadblock and don't know how to fix it. For some reason, in my
> checkQueue function below, the call to self.goUp() is never executed. It is
> on the last line of code I pasted in. I can put print statements before and
> after the call and I have a print statement in goUp() itself.  Only the
> print statements before and after the call are executed. The one inside
> goUp() is never executed because goUp() never seems to be executed. How can
> that be? I don't get any errors when the script executes. Surely this isn't
> some limitation I'm encountering?

I think the self.goUp() call is executed, the goUp function gets
called, returns a generator object (because goUp is a generator
function), then you don't use that generator object for anything.


Daniel
From: nn on
On Aug 5, 2:01 pm, Daniel Urban <urban.d...(a)gmail.com> wrote:
> > I'm building an elevator simulator for a class assignment. I recently ran
> > into a roadblock and don't know how to fix it. For some reason, in my
> > checkQueue function below, the call to self.goUp() is never executed. It is
> > on the last line of code I pasted in. I can put print statements before and
> > after the call and I have a print statement in goUp() itself.  Only the
> > print statements before and after the call are executed. The one inside
> > goUp() is never executed because goUp() never seems to be executed. How can
> > that be? I don't get any errors when the script executes. Surely this isn't
> > some limitation I'm encountering?
>
> I think the self.goUp() call is executed, the goUp function gets
> called, returns a generator object (because goUp is a generator
> function), then you don't use that generator object for anything.
>
> Daniel

Brandon, this example might help you understand the problem:

>>> def g():
print('p1')
yield 2
print('p3')


>>> g()
<generator object g at 0x00F04DC8>
>>> b=g()
>>> next(b)
p1
2
>>> next(b)
p3
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
next(b)
StopIteration
>>>