Access property by argument name (dot and bracket notation not equal)
Defined properties use ID properties as storage

A defined property bpy.types.Scene.xxxx = bpy.props.BlahProperty(default=default)  is stored as an ID property scene["xxxx"] once it is set (non default). See get set example  

&gt;&gt;&gt; bpy.types.Scene.xxxx = bpy.props.IntProperty(default=11)
&gt;&gt;&gt; C.scene.xxxx
11

&gt;&gt;&gt; C.scene['xxxx']
Traceback (most recent call last):
  File "&lt;blender_console&gt;", line 1, in &lt;module&gt;
KeyError: 'bpy_struct[key]: key "xxxx" not found'

&gt;&gt;&gt; C.scene.xxxx = 12
&gt;&gt;&gt; C.scene['xxxx']
12


You see a struct printed for the property scene.xxxx if it is a pointer or collection, or an int for IntProperty, a str for StringProperty.

Henceforth, rather than scene[propname]  a more generic pythonic way would be using

getattr(scene, propname, None)


to return, if propname == "xxxx",  scene.xxxx if it exists, else None.

for the defined default

&gt;&gt;&gt; C.scene.bl_rna.properties['xxxx'].default
11