Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 蟒蛇3—;替换动态选择的namedtuple字段_Python_Namedtuple - Fatal编程技术网

Python 蟒蛇3—;替换动态选择的namedtuple字段

Python 蟒蛇3—;替换动态选择的namedtuple字段,python,namedtuple,Python,Namedtuple,我正在使用集合.namedtuple对数据库记录进行建模。有时,我希望用户能够替换任意字段的内容。\u replace()方法允许替换特定字段的内容,只要我们可以将其名称指定为参数的一部分:somenamedtuple.\u replace(somefield=newcontent)。但是,如果名称本身是由用户动态提供的,我无法找到一种方法来实现它 下面是一个简单的工作示例: from collections import namedtuple fields = ['one', 'two',

我正在使用集合.namedtuple对数据库记录进行建模。有时,我希望用户能够替换任意字段的内容。
\u replace()
方法允许替换特定字段的内容,只要我们可以将其名称指定为参数的一部分:
somenamedtuple.\u replace(somefield=newcontent)
。但是,如果名称本身是由用户动态提供的,我无法找到一种方法来实现它

下面是一个简单的工作示例:

from collections import namedtuple

fields = ['one', 'two', 'three']
Record = namedtuple('Record', fields)
# Populate fields.
record = Record(*tuple(['empty' for i in fields]))
while True:
    # Show what we have already.
    print('0: quit')
    for i in range(len(fields)):
    print('{}: {}: {}'.format(i+1, fields[i], record[i]))
    to_change = int(input('Field to change: '))
    if not to_change:
        break
    else:
        new_content = input('New content: ')
        field_to_change = {fields[to_change-1]:new_content}
        print('Setting', field_to_change)
        record._replace(**field_to_change)
print('Finished.')
print(record)
输出(Ipython 1.0.0、Python 3.3.1)如下

In [1]: run test_setattr_namedtuple
0: quit
1: one: empty
2: two: empty
3: three: empty
Field to set: 2
New content: asdf
Setting {'two': 'asdf'}
0: quit
1: one: empty
2: two: empty
3: three: empty
Field to set: 0
Finished.
Record(one='empty', two='empty', three='empty')

In [2]: 
record.\u replace()
行试图将'two'设置为'asdf',而不是
two
,因此失败。我曾想过在
\u replace()
中使用
eval
,但
\u replace()
不接受表达式作为参数

我还尝试了内置函数
setattr
,但它不适用于namedtuple,可能是因为它们是不可变的

方法
\u replace()
返回更改后的命名元组实例。您正在丢弃返回的值

与元组一样,namedtuple派生类实例是不可变的,
\u replace()
不会更改相应的值

将原始值替换为新值:

record = record._replace(**field_to_change)                                         
\u replace()
方法返回已更改的命名元组实例。您正在丢弃返回的值

与元组一样,namedtuple派生类实例是不可变的,
\u replace()
不会更改相应的值

用新值替换原始值:

record = record._replace(**field_to_change)                                         

啊,啊。。。谢谢你,啊,啊。。。非常感谢。