[Zope-dev] Bug in ExternalMethods?

2002-12-19 Thread Clemens Robbenhaar

Hi Tim,

 > Here's a small demonstration of the bug:
 > 
 > --test.py--
 > def test(self, a_string, an_int, a_named_arg=1):
 > """bug provoking?"""
 > template =  """a_string = %s; type(a_string) -> %s\n
 > an_int = %s; type(an_int) -> %s\n
 > a_named_arg = %s; type(a_named_arg) -> %s"""
 > return template % (a_string, type(a_string), an_int, type(an_int),
 > a_named_arg, type(a_named_arg))
 > 

 External methods need no "self" (and normally should have no "self") as
first parameter, as they are not methods of some objects, I thought.
But Zope seems to do some magic here.

 > 
 > --Script (Python)--
 > return container.test('tim', 10, a_named_arg=(1,1))
 > return container.test('tim', 10, (1,1))
 > 
 > 

 Indeed the first call should be illegal, as one passes only two
non-keyword arguments, but the function has three arguments without
default values. If I try to call the function from the python
command line in an equivalent way as done here by the script, I get an
TypeError: test() takes at least 3 non-keyword arguments (2 given).

 But Zope seems to mangle in the container/context into the "self" argument,
if the following two conditions hold:
 
 1. the first argument is named "self".
(If the first argument is named "foo", it does not work.)
 2. there are to less arguments to make a "normal" function call


 Condition 2. is true for the first call, but not for the second one.
Here enough arguments are provided to make a plaing function call
with the arguments:

  self='tim', a_string=10, an_int=(1,1), a_named_arg=(1,1),

as defined by the caller or the default values.


 Thus I guess it is not a bug, but a feature. There is actually an
example for this usage in the Zope Book (with the image thumbnails), but
at least I failed to recognise the magic "self" mumble.


Cheers,
Clemens

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )



Re: [Zope-dev] Bug in ExternalMethods?

2002-12-19 Thread Dieter Maurer
Tim Hicks writes:
 > I think I've found a bug in ExternalMethod, but I don't know if it's
 > already been fixed or not.
 > 
 > Basically, the call signature of ExternalMethods seems to get mixed up
 > sometimes.  I'm running Zope 2.5.1 on Linux.
 > 
 > Here's a small demonstration of the bug:
 > 
 > --test.py--
 > def test(self, a_string, an_int, a_named_arg=1):
 > """bug provoking?"""
 > template =  """a_string = %s; type(a_string) -> %s\n
 > an_int = %s; type(an_int) -> %s\n
 > a_named_arg = %s; type(a_named_arg) -> %s"""
 > return template % (a_string, type(a_string), an_int, type(an_int),
 > a_named_arg, type(a_named_arg))
 > 
 > 
 > --Script (Python)--
 > return container.test('tim', 10, a_named_arg=(1,1))
 > return container.test('tim', 10, (1,1))
 > 
 > 
 > You can see the dodgy behaviour by switching between the two test() calls
 > in the Script (Python).
This is not a bug but a documented "feature".

  The automatic "self" passing magic only happens when you
  call the method with one positional argument less than required.
  (This does not apply to ZPublisher which uses a different way.)
  
  Your External Method has 3 required and one optional argument.

  In your first case, you pass 2 required positional arguments
  and give the optional a different value. As one required positional
  argument is missing, "self" is passed in automatically.

  In your second case, you pass 3 required positional arguments.
  "self" is not passed in automatically passed in automatically.

Some say magic is bad 
Pass your self explicitly!


Dieter

___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )



[Zope-dev] Bug in ExternalMethods?

2002-12-19 Thread Tim Hicks
I think I've found a bug in ExternalMethod, but I don't know if it's
already been fixed or not.

Basically, the call signature of ExternalMethods seems to get mixed up
sometimes.  I'm running Zope 2.5.1 on Linux.

Here's a small demonstration of the bug:

--test.py--
def test(self, a_string, an_int, a_named_arg=1):
"""bug provoking?"""
template =  """a_string = %s; type(a_string) -> %s\n
an_int = %s; type(an_int) -> %s\n
a_named_arg = %s; type(a_named_arg) -> %s"""
return template % (a_string, type(a_string), an_int, type(an_int),
a_named_arg, type(a_named_arg))


--Script (Python)--
return container.test('tim', 10, a_named_arg=(1,1))
return container.test('tim', 10, (1,1))


You can see the dodgy behaviour by switching between the two test() calls
in the Script (Python).


tim



___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )