Status: New
Owner: ken...@google.com
Labels: Type-Defect Priority-Medium

New issue 208 by kleptog: python: constructor does not type check scalar values
http://code.google.com/p/protobuf/issues/detail?id=208

What steps will reproduce the problem?
1. Create a simple protocol file, such as (test.proto):

--- cut ---
message CompositeType {
    required int32 stamp = 1;
}
--- cut ---

2. compile the protocol to python using protoc.

3. Execute the following interactively:

In [1]: from test_pb2 import *

In [2]: c=CompositeType(stamp='foobar')

# Now we have a string in an integer field

In [3]: print c
stamp: foobar

# Serialisation blows up

In [4]: c.SerializeToString()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/tmp/<ipython console> in <module>()

... lots of traceback data ...

TypeError: unsupported operand type(s) for &: 'str' and 'int'

What is the expected output? What do you see instead?

I expected the creation of the object to throw a TypeError exception. A direct assignment of the same value produces:

In [5]: c.stamp='foobar'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

... lots of traceback ...

TypeError: 'foobar' has type <type 'str'>, but expected one of: (<type 'int'>, <type 'long'>)

which is expected.

What version of the product are you using? On what operating system?

protobuf 2.3.0 on python 2.5 on Debian 5.0

Please provide any additional information below.

This is simply a case of the constructor being cute and bypassing the proper handlers for setting values. This can be solved by changing one line in reflection.py:_AddInitMethod.init. Replace:

        self._fields[field] = field_value

in the final else: with

        setattr(self, field, field_value)

which will call the appropriate type checker.

Note that for non-scalar fields it doesn't type check either but because it uses MergeFrom you don't get exceptions from deep within the serialisation code, so I don't think that's as much of a problem.


--
You received this message because you are subscribed to the Google Groups "Protocol 
Buffers" group.
To post to this group, send email to proto...@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to