# 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)

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:

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)

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)

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. That's exactly what I was searching for.

-ScottA