|
-
- Experimental method for handing ordered vs named method parameters
- ------------------------------------------------------------------
-
- There is an incompatibility with the way that Python and SOAP handle
- method arguments: SOAP requires that all arguments have names and that
- they are presented in the same order as the method signature. Python
- (like other scripting languages, notably the S language) has the
- concept of unnamed arguments. Further Python does not preserve the
- order of named arguments, since they are handled using the dictionary
- data type. It seems to me that this makes it impossible to fully meet
- the SOAP specification without significant modifications to the Python
- method of handling named arguments or to the Python dictionary class.
-
- Historically SOAPpy has attempted to work around this issue by
- handling all arguments as unnamed unless the method or function was
- explicitly flagged, in which case all arguments were considered named.
- This has resulted in a several problems, particularly for a SOAPpy
- client communicating with a SOAPpy server. First, when named
- arguments were used in call to a non-flagged function, the argument
- would silently be reordered by the sender (since they were stored
- using a Python dictionary), *and* the names would be ignored by the
- receiver, which assumed that the parameters were unnamed and only the
- order was significant. This results in incorrect argument matching.
- This problem also occurred with mixed named and unnamed arguments.
-
- For my primary SOAP application, it is not reasonable to flag all of
- the SOAPpy methods as requiring named arguments, for a variety of
- reasons. One reason is that the available methods are not known
- apriori by the client software, hence the names of the arguments are
- not known. Second, many of the methods provide a large number of
- optional arguments, making it impractical to specify them all.
-
- In an attempt to overcome this problem, I implemented an experimental
- and non-standard method of handling named and unnamed arguments. This
- mechanism is enabled in SOAPpy by setting
- SOAPpy.SOAP.Config.specialArgs=1, and disabled by setting
- SOAPpy.SOAP.Config.specialArgs=0.
-
- When enabled, parameters with names of the form v#### (i.e., matching
- the regexp "^v[0-9]+$") are assumed to be unnamed parameters and are
- passed to the method in numeric order. All other parameters are
- assumed to be named and are passed using the name. Outgoing SOAP
- method calls now always generate names in this way--whether or not
- specialArgs is enabled.
-
-
- I selected the form v#### because it is a valid XML name, but is
- unlikely to be used as a parameter name.
-
- [As it turns out, this choice was fortitous because Apache's SOAP tool
- uses the same system.]
-
- In my testing, this mechanism for handling method parameter names
- works fine between a SOAPpy client and a SOAPpy server, and resolves
- the parameter reordering problems I was experiencing. This system
- seems unlikely to have any negative side effects on other SOAP
- applications, except in the (hopefully) rare case when v#### might be
- used as an actual parameter name.
-
- **In version 0.9.9-pre1, this feature is enabled by default.** Please
- let me know if there are situations where this causes problems.
-
- Note that this mechanism is only a partial solution, since it is still
- impossible to return named parameters in a specified order using
- SOAPpy. SOAP applications or implementations which require this
- feature are simply not compatible with SOAPpy.
-
- -Greg Warnes <Gregory.R.Warnes@Pfizer.com>
- 2003-03-07 (updated 2003-11-14)
|