简体   繁体   English

Python中的类常量字典

[英]Class constant dictionary in Python

I'm building a module that has a class variable dictionary: 我正在构建一个具有类变量字典的模块:

class CodonUsageTable:
        CODON_DICT={'TTT': 0, 'TTC': 0, 'TTA': 0, 'TTG': 0, 'CTT': 0,
        'CTC': 0, 'CTA': 0, 'CTG': 0, 'ATT': 0, 'ATC': 0,
        'ATA': 0, 'ATG': 0, 'GTT': 0, 'GTC': 0, 'GTA': 0,
        'GTG': 0, 'TAT': 0, 'TAC': 0, 'TAA': 0, 'TAG': 0,
        'CAT': 0, 'CAC': 0, 'CAA': 0, 'CAG': 0, 'AAT': 0,
        'AAC': 0, 'AAA': 0, 'AAG': 0, 'GAT': 0, 'GAC': 0,
        'GAA': 0, 'GAG': 0, 'TCT': 0, 'TCC': 0, 'TCA': 0,
        'TCG': 0, 'CCT': 0, 'CCC': 0, 'CCA': 0, 'CCG': 0,
        'ACT': 0, 'ACC': 0, 'ACA': 0, 'ACG': 0, 'GCT': 0,
        'GCC': 0, 'GCA': 0, 'GCG': 0, 'TGT': 0, 'TGC': 0,
        'TGA': 0, 'TGG': 0, 'CGT': 0, 'CGC': 0, 'CGA': 0,
        'CGG': 0, 'AGT': 0, 'AGC': 0, 'AGA': 0, 'AGG': 0,

#Other code

        def __init__(self,seqobj):
                '''Creates codon table for a given Bio.seq object.i
                The only argument is Bio.Seq object with DNA
                Currently assumes seq to be DNA, RNA support to be added later'''
                dnaseq=str(seqobj)
                self.usage_table=CodonUsageTable.CODON_DICT.deepcopy()#instance of table

The last line must make a copy of class dictionary to store instance data in it, but it throws 最后一行必须创建一个类字典的副本来存储实例数据,但它会抛出

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "./codon_usage.py", line 47, in __init__
    self.usage_table=CodonUsageTable.CODON_DICT.deepcopy()#instance of codon usage table
NameError: global name 'CODON_DICT' is not defined

So does self.CODON_DICT , CODON_DICT or codon_usage.CodonUsageTable.CODON_DICT , when called from __init__ . __init__调用时, self.CODON_DICTCODON_DICTcodon_usage.CodonUsageTable.CODON_DICT Dictionary is defined: 字典定义如下:

>>>import codon_usage
>>> codon_usage.CodonUsageTable.CODON_DICT
{'GCT': 0, 'GGA': 0, 'TTA': 0, 'GAT': 0, 'TTC': 0, 'TTG': 0, 'AGT': 0, 'GCG': 0, 'AGG': 0, 'GCC': 0, 'CGA': 0, 'GCA': 0, 'GGC': 0, 'GAG': 0, 'GAA': 0, 'TTT': 0, 'GAC': 0, 'TAT': 0, 'CGC': 0, 'TGT': 0, 'TCA': 0, 'GGG': 0, 'TCC': 0, 'ACG': 0, 'TCG': 0, 'TAG': 0, 'TAC': 0, 'TAA': 0, 'ACA': 0, 'TGG': 0, 'TCT': 0, 'TGA': 0, 'TGC': 0, 'CTG': 0, 'CTC': 0, 'CTA': 0, 'ATG': 0, 'ATA': 0, 'ATC': 0, 'AGA': 0, 'CTT': 0, 'ATT': 0, 'GGT': 0, 'AGC': 0, 'ACT': 0, 'CGT': 0, 'GTT': 0, 'CCT': 0, 'AAG': 0, 'CGG': 0, 'AAC': 0, 'CAT': 0, 'AAA': 0, 'CCC': 0, 'GTC': 0, 'CCA': 0, 'GTA': 0, 'CCG': 0, 'GTG': 0, 'ACC': 0, 'CAA': 0, 'CAC': 0, 'AAT': 0, 'CAG': 0}        'GGT': 0, 'GGC': 0, 'GGA': 0, 'GGG': 0}

The symptoms imply that the story went like this: 症状暗示故事是这样的:

  1. you wrote the file and saved it; 你写了文件并保存了;
  2. you ran the Python shell; 你运行了Python shell;
  3. you found that CODON_DICT can't be accessed just like that and fixed that; 你发现无法像那样访问CODON_DICT并修复它;
  4. you tried that call again within the same Python shell and got that error. 你在同一个Python shell中再次尝试了这个调用并得到了这个错误。

That happens because Python is still using the old version of the module, which is loaded during the import. 之所以会发生这种情况,是因为Python仍在使用导入过程中加载的旧版本模块。 Although it shows the line from the new file, since all it has in the memory is the bytecode with metadata and has to refer to the disk when error happens. 虽然它显示了新文件中的行,但由于它在内存中的所有内容都是带有元数据的字节码,并且在发生错误时必须引用磁盘。 If you want to pick your latest changes without restarting the shell, run: 如果要在不重新启动shell的情况下选择最新更改,请运行:

>>> reload(codon_usage)

and try again. 然后再试一次。

(A sidenote: dict has no method deepcopy , that function comes from the module copy . dict.copy is enough here, though). (旁注: dict有没有方法deepcopy ,该函数来自模块copydict.copy足够在这里,虽然)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM