Python 什么';记录namedtuple的标准方法是什么?

Python 什么';记录namedtuple的标准方法是什么?,python,code-documentation,Python,Code Documentation,希望通过使用namedtuple保存多个变量以通过多个函数来清理一些代码。下面是一个简化的示例(实际上我还有一些附加参数) 之前: def my_function(session_cass, session_solr, session_mysql, some_var, another): """Blah blah. Args: session_cass (Session): Cassandra session to execute queries with. session_s

希望通过使用namedtuple保存多个变量以通过多个函数来清理一些代码。下面是一个简化的示例(实际上我还有一些附加参数)

之前:

def my_function(session_cass, session_solr, session_mysql, some_var, another):
"""Blah blah.

Args:
    session_cass (Session): Cassandra session to execute queries with.
    session_solr (SolrConnection): Solr connection to execute requests with.
    session_mysql (connection): MySQL connection to execute queries with.
    some_var (str): Yada yada.
    another (int): Yada yada.
"""
之后:

def my_function(sessions, some_var, another):
"""Blah blah.

Args:
    sessions (namedtuple): Holds all the database sessions.
    some_var (str): Yada yada.
    another (int): Yada yada.
"""
对于Docstring,我一直遵循Google风格指南,添加了类型(灵感来自),我非常喜欢它,因为它使跟踪即将出现的类型变得更加容易

我的问题是,在这个场景中,您将如何记录一个namedtuple?很明显,由于当前已设置,您没有关于namedtuple中类型的信息。是否有一种可接受的方法在此处扩展docstring,或在定义(未显示)的位置记录namedtuple


我知道你可以在这个庄园中记录一个类,但我尽量避免使用类,因为我除了保存变量之外,没有其他任何用途

我不熟悉Google style guide,但是这个怎么样:

对于命名的元组、元组或列表或任何可以互换的东西,我会选择这样的东西

def my_function(sessions, some_var, another):
    """Blah blah.

    Args:
        sessions (sequence): A sequence of length n that 
                             holds all the database sessions.
                             In position 0 need bla bla
                             In position 1 need ble ble
                             ...
                             In position n-1 need blu blu
        some_var (str): Yada yada.
        another (int): Yada yada.
    """    
def my_function(sessions, some_var, another):
    """Blah blah.

    Args:
        sessions (object): A object that holds all the database sessions.
                           It need the following attributes 
                           bla_bla is ...
                           ble_ble is ...
                             ...
                           blu_blu is ...
        some_var (str): Yada yada.
        another (int): Yada yada.
    """    
另一方面,如果我使用namedtuple的属性,那么可能是这样的

def my_function(sessions, some_var, another):
    """Blah blah.

    Args:
        sessions (sequence): A sequence of length n that 
                             holds all the database sessions.
                             In position 0 need bla bla
                             In position 1 need ble ble
                             ...
                             In position n-1 need blu blu
        some_var (str): Yada yada.
        another (int): Yada yada.
    """    
def my_function(sessions, some_var, another):
    """Blah blah.

    Args:
        sessions (object): A object that holds all the database sessions.
                           It need the following attributes 
                           bla_bla is ...
                           ble_ble is ...
                             ...
                           blu_blu is ...
        some_var (str): Yada yada.
        another (int): Yada yada.
    """    
这本字典怎么样

def my_function(sessions, some_var, another):
    """Blah blah.

    Args:
        sessions (map): A dictionary-like object that holds all the 
                        database sessions, it need the following keys
                        bla_bla is ...
                        ble_ble is ...
                           ...
                        blu_blu is ...
        some_var (str): Yada yada.
        another (int): Yada yada.
    """    


在每种情况下,只需要求函数正常工作所需的最低功能即可。Python3文档显示,可以通过将自己的字符串附加到
\uuuuu doc\uuuu
字段来定制namedtuple的docstring。对于你的问题,你可以写:

Sessions = namedtuple('Sessions', ['cass', 'solr', 'mysql'])
Sessions.__doc__ += ': All database sessions.'
Sessions.cass.__doc__ += ': Cassandra session to execute queries with.'
Sessions.solr.__doc__ += ': Solr connection to execute requests with.'
Sessions.mysql.__doc__ += ': MySQL connection to execute requests with.'
然后执行
帮助(会话)
输出:

Help on class Sessions in module MyModule:

class Sessions(builtins.tuple)
|  Sessions(cass, solr, mysql): All database sessions.
|  
|  Method resolution order:
|      Sessions
在其他几行文档之后:

|----------------------------------------------------------------------
|  Data descriptors defined here:
|  
|  cass
|      Alias for field number 0: Cassandra session to execute queries with.
|  
|  solr
|      Alias for field number 1: Solr connection to execute requests with.
|  
|  mysql
|      Alias for field number 2: MySQL connection to execute requests with.
|  
|  ----------------------------------------------------------------------

诚然,
会话的自动文档文本量会使您很难找到添加的特定文档。

为什么它是命名元组?为什么不直接使用一个{ident:session}的(任意)字典,甚至只是一个会话列表。。。您是否真的在验证传入的命名元组(根据我的经验,命名元组作为返回值比方法参数更有效)没有特殊原因。我考虑了这两种情况并任意选择了namedtuple——它看起来更“轻量级”,通常在值都是相同类型时使用字典(我知道可以混合类型)。无论如何,我认为这两个问题都是一样的——从更一般的意义上说,当你将其中一个传递到一个函数中,并且它们包含混合类型时,最好的方法是什么?也许最好只使用一个类(记录类文档中的类型),或者不必担心它,而是返回到命名的元组/字典的初始化位置。我在尝试此操作时遇到了此错误:
AttributeError:attribute'\uu doc\uuuu'的'type'对象的属性'\uuu\uu'不可写
。我使用的是python 2.7。@这在2.7中是预期的,部分解决方法是子类化namedtuple。有关一个简单的示例,请参阅本答案文档部分的示例。