Ternary Operator in Python

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 11:51, xxxxxxxx wrote:

Hey guys,
I can't seem to figure out the proper syntax python needs run ternary conditions.

Here's an example that works in Coffee:

main(doc,op)  
{  
 var distance = 1.5; // the larger the number the farther the travel   
 var pos = op->GetAbsPos() ? vector(0,0,0) : vector(0,100,0) * distance;  
 op->SetAbsPos(pos);  
}

I can't seem to get this same code to work in python:

import c4d  
def main() :  
  distance = 1.5 # the larger the number the farther the travel   
  pos = op.GetAbsPos() if c4d.Vector(0,0,0) else c4d.Vector(0,100,0) * distance  
  op.SetAbsPos(pos)  
  c4d.EventAdd()  
  
if __name__=='__main__':  
  main()

What am I doing wrong?

-ScottA

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 12:20, xxxxxxxx wrote:

See this thread on StackOverflow

Your example works for me.

Btw, what do you want to reach with that tenary conditiom ? It seems senseless to me.

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 13:14, xxxxxxxx wrote:

I'm trying to toggle things with it.
The coffee example I posted toggles an object's Y position.

I've looked at lots of examples. But I can only get a one way result in python.
Here's an example of it only working in one direction. Which is not what I want:

import c4d  
from c4d import gui  
  
def main() :  
  pos = op.GetAbsPos() if op.GetAbsPos==c4d.Vector(0,0,0) else c4d.Vector(0,100,0)  
  op.SetAbsPos(pos)  
  c4d.EventAdd()  
  
if __name__=='__main__':  
  main()

I can't find any examples on how to use it as a toggle.

-ScottA

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 13:57, xxxxxxxx wrote:

I don't understand what you are trying to achive.
(I'm also not quite sure if the coffee ternary conditiom has the same structure ?)

a if b else c means Give a if b is True, if not, give c. and is the same as

if b:   
a   
else:   
c

Translating your code would mean the following:

Set 'pos' to op.GetAbsPos if Vector(0) is True, if not, set 'pos' to Vector(0,100,0) * distance.
Using a constant as 'b' is senseless. (Vector(0) is a constant)

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 14:23, xxxxxxxx wrote:

I don't know how else to explain it.
My coffee example does what I want. I'm simply looking for the python version of it.

-ScottA

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 26/07/2011 at 14:39, xxxxxxxx wrote:

condition ? value if True : value if False Is this right for the coffee version ? (cant test it)
I yes, you are doing it wrong in python.
value if True if condition else v alue if False

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 27/07/2011 at 09:26, xxxxxxxx wrote:

Hy Scott,

here is a solution:

  
import c4d  
def main() :  
  distance = 1.5 # the larger the number the farther the travel   
  pos =  c4d.Vector(0,100,0) * distance if (op.GetAbsPos() == c4d.Vector(0,0,0)) else c4d.Vector(0,0,0)  
  op.SetAbsPos(pos)  
  c4d.EventAdd()  
  
if __name__=='__main__':  
  main()  

The reason for your confusion comes from the fact, that COFFEE has some "additional" information when it comes to comparisons. In the ternary operator you ask COFFEE to compare a vector to the state "is defined". COFFEE *knows... actually, a strange assumption* that only a zero-vector is (seen as) undefined. So the question for COFFEE is:

op->GetAbsPos() is defined ?

This will return 0 only for the zero-vector. That is the reason why it worked so far in COFFEE. In Python, this does not make sense. Python will just look if the variable if the condition is not 0 or None (ie. defined, which it always is, when given a vector).

Cheers,
maxx

Edit: explanation wasn't that accurate, up to date ...

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 27/07/2011 at 10:34, xxxxxxxx wrote:

Thanks a lot Maxx.:beer:
That's exactly what I was searching for.

-ScottA