I was playing around a bit:

I tried to have
typedef QVariant QgsAttribute; as a MappedType, but unfortunately sip 
resolves it to still use QVariant and not our mapped type QgsAttribute 
(which converts anything which returns true on ->isNull() to a None 
value in python)

* So we probably could give it another try with a real class 
QgsAttribute which inherits QVariant to get sip to do what we want 
(possibly involving a lot of replacements throughout the whole codebase)
* Add %MethodCode blocks in sip files to methods like uniqueValues() 
maximumValue() minimumValue() etc. Involving a lot of code to write and 
maintain in the sip files (which would normally be generated)
* Forget about the idea to convert NULL attribute values to None and 
instead leave them converted to QPyNullVariant (which is not so bad, as 
it has a isNull() method, evaluates to false if bool tested... just "is 
None" will not work)

Any other ideas for a good solution?