Hi,<br><br>Although implementing the arithmetic operator overloads solve my problem, I am still curious if there is a way to implement the implicit conversion in Python, much like the sample C# program below does. This is a question about the language, so please forgive me if I am asking in the wrong mailing list.<div>
<br></div><div><p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas;color:blue">class</span><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas">
<span style="color:#2b91af">DataValue</span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">public</span> <span style="color:blue">double</span> Value { <span style="color:blue">get</span>; <span style="color:blue">set</span>; }</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">public</span> <span style="color:#2b91af">DateTime</span> Timestamp { <span style="color:blue">get</span>;
<span style="color:blue">set</span>; }</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="background-color:rgb(255,255,153)"><span style="color:blue">public</span> <span style="color:blue">static</span> <span style="color:blue">implicit</span> <span style="color:blue">operator</span> <span style="color:blue">double</span>(<span style="color:#2b91af">DataValue</span> dataValue)</span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">return</span>
dataValue.Value;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> }</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> }</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">class</span> <span style="color:#2b91af">Program</span></span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:blue">static</span> <span style="color:blue">void</span> Main(<span style="color:blue">string</span>[]
args)</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> {</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:#2b91af">DataValue</span>
val1 = <span style="color:blue">new</span> <span style="color:#2b91af">DataValue</span>
{ Value = 2.5 };</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> <span style="color:#2b91af">DataValue</span>
val2 = <span style="color:blue">new</span> <span style="color:#2b91af">DataValue</span>
{ Value = 3.5 };</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> </span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span lang="EN-US" style="font-size:9.5pt;font-family:Consolas"> </span><span style="font-size:9.5pt;font-family:Consolas;color:blue">double</span><span style="font-size:9.5pt;font-family:Consolas"> sum = val1 + val2;</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:9.5pt;font-family:Consolas"> <span style="color:#2b91af">Console</span>.WriteLine(sum.ToString());</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:9.5pt;font-family:Consolas"> }</span></p>
<p class="MsoNormal" style="margin-bottom:0.0001pt"><span style="font-size:9.5pt;font-family:Consolas"> }</span></p></div><br><div>Notice I did not need to implement the operator+ overload, and this object can be used anywhere a double is. I suppose this can be done with __coerce__ in Python 2, but that is not recommended in the documentation (and was removed in Python 3). Is there any other way to obtain this behavior in Python?<div>
<br></div><div><div>I agree it may be error-prone. But there are valid scenarios where it is not. Although implementing the arithmetic overloads allow me to mix DataValues and floats in the same expressions, I am not able to initialize a Python's Decimal with a DataValue, for example. In C# that could be done.</div>
<div><br><div>Thank you very much for the attention!<div><br></div><div>Best regards</div><div>Mello<br><br><br><div class="gmail_quote">On Fri, Feb 24, 2012 at 7:50 PM, Cesar Mello <span dir="ltr"><<a href="mailto:cmello@gmail.com">cmello@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">OK thank you very much!<div><br></div><div>Best regards</div><div><span class="HOEnZb"><font color="#888888">Mello</font></span><div>
<div class="h5"><br><br><div class="gmail_quote">On Fri, Feb 24, 2012 at 6:17 PM, Jeff Hardy <span dir="ltr"><<a href="mailto:jdhardy@gmail.com" target="_blank">jdhardy@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Fri, Feb 24, 2012 at 12:00 PM, Cesar Mello <<a href="mailto:cmello@gmail.com" target="_blank">cmello@gmail.com</a>> wrote:<br>
> Thank you very much for the quick response Jeff!<br>
><br>
> First, let me clarify I am a Python newbie, so my assumptions about Python<br>
> may be all wrong.<br>
><br>
> I had tried __float__ in a Python object, but it does not work implicitly<br>
> inside expressions (and I think that's the correct behavior). You still have<br>
> to use float(a) for the conversion to be used.<br>
><br>
> Now I implemented the C# implicit conversion to double() and I get the same<br>
> behavior (it works if I use float(a) in the expression but if I use a * 5.0<br>
> for example I get the error: "unsupported operand type(s) for *: 'DataValue'<br>
> and 'float'.<br>
<br>
</div>Ah, you missed this first part: you'll need to overload the arithmetic<br>
operators for your objects.<br>
<br>
Python: Define __add__, __sub__, etc.<br>
(<a href="http://docs.python.org/reference/datamodel.html#object.__add__" target="_blank">http://docs.python.org/reference/datamodel.html#object.__add__</a>)<br>
C#: Define operator+, operator-, etc.<br>
(<a href="http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx" target="_blank">http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx</a>)<br>
<span><font color="#888888"><br>
- Jeff<br>
</font></span></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div></div></div>