Did you read the rest of the mne.Info docstring? It says, among other things:
The only entries that should be manually changed by the user are info['bads'], info['description'], info['device_info'], info['dev_head_t'], info['experimenter'], info['helium_info'], info['line_freq'], info['temp'] and info['subject_info']. All other entries should be considered read-only, though they can be modified by various MNE-Python functions or methods (which have safeguards to ensure all fields remain in sync).
So you can certainly do things like raw.info['description'] = 'whatever'. I donât know if the length of the string is limited; we donât limit it in our code but it might be constrained by the .fif file format when saving the info, or when saving a data object with that info attached to it. @larsoner probably knows that answer.
subject_info is also in the above list of entries that may be changed by the user. So raw.info['subject_info'] = some_dict is fine, as is raw.info['subject_info'].update(last_name='Kanda', first_name='Paolo', ...)
is that you should not do my_new_info = mne.Info(...) (that would be âdirect class instantiationâ) but instead you should do my_new_info = mne.create_info(...) (using our function to create an instance of the Info class). The function is preferred because it has lots of built-in safety checks to make sure your Info object is consistent / has everything it needs to work properly with our data classes like Raw, Epochs, etc. But both of these possibilities apply when you want a new Info object, not when you want to update fields in an existing Info object. For that, see my prior answer above.
AFAIK there isnât any real limit on the str size. I think in practice youâre going to hit problems as you get close to 2GB, but hopefully your info['description'] doesnât get close to this