@@ -174,6 +174,17 @@ def getMemberKey(self, member):
174174 return member .lower ()
175175
176176 def getMemberCPAddress (self , member ):
177+ """Get the canonical address of a member.
178+
179+ Args:
180+ member: The member's email address
181+
182+ Returns:
183+ str: The member's canonical address
184+
185+ Raises:
186+ NotAMemberError: If the member is not found
187+ """
177188 cpaddr , where = self .__get_cp_member (member )
178189 if cpaddr is None :
179190 raise Errors .NotAMemberError (member )
@@ -221,10 +232,18 @@ def getMemberOption(self, member, flag):
221232 return not not (option & flag )
222233
223234 def getMemberName (self , member ):
235+ """Get the real name of a member.
236+
237+ Args:
238+ member: The member's email address
239+
240+ Returns:
241+ str: The member's real name, or None if not set
242+ """
224243 self .__assertIsMember (member )
225244 name = self .__mlist .usernames .get (member .lower ())
226245 if name is None :
227- return ''
246+ return None
228247 if isinstance (name , bytes ):
229248 try :
230249 # Try Latin-1 first since that's what we're seeing in the data
@@ -432,7 +451,12 @@ def setMemberOption(self, member, flag, value):
432451 del self .__mlist .user_options [memberkey ]
433452
434453 def setMemberName (self , member , realname ):
435- assert self .__mlist .Locked ()
454+ """Set the real name of a member.
455+
456+ Args:
457+ member: The member's email address
458+ realname: The member's real name
459+ """
436460 self .__assertIsMember (member )
437461 if realname is None :
438462 realname = ''
@@ -443,7 +467,6 @@ def setMemberName(self, member, realname):
443467 except UnicodeDecodeError :
444468 # Fall back to UTF-8 if Latin-1 fails
445469 realname = realname .decode ('utf-8' , 'replace' )
446- # Store as a Python 3 string
447470 self .__mlist .usernames [member .lower ()] = str (realname )
448471
449472 def setMemberTopics (self , member , topics ):
0 commit comments