2012-10-03 35 views
1

你好,我正嘗試在Python中使用從Creating constant in Python(在鏈接的第一個答案中)找到的這個例子創建一個常量,並使用實例作爲模塊。如何在python中模擬常量變量

的第一個文件const.py具有

# Put in const.py...: 
class _const: 
    class ConstError(TypeError): pass 
    def __setattr__(self,name,value): 
     if self.__dict__ in (name): 
      raise self.ConstError("Can't rebind const(%s)"%name) 
     self.__dict__[name]=value 
import sys 
sys.modules[__name__]=_const() 

一部分劃入到test.py了例如。

# that's all -- now any client-code can 
import const 
# and bind an attribute ONCE: 
const.magic = 23 
# but NOT re-bind it: 
const.magic = 88  # raises const.ConstError 
# you may also want to add the obvious __delattr__ 

雖然我因爲我使用python 3取得2個改變我仍然得到錯誤

Traceback (most recent call last): 
    File "E:\Const_in_python\test.py", line 4, in <module> 
    const.magic = 23 
    File "E:\Const_in_python\const.py", line 5, in __setattr__ 
    if self.__dict__ in (name): 
TypeError: 'in <string>' requires string as left operand, not dict 

我不明白的線5的錯誤是什麼。誰能解釋一下?更正這個例子也不錯。提前致謝。

回答

3

這條線:

if self.__dict__ in (name): 

應該

if name in self.__dict__: 

...你想知道如果該屬性是在字典,沒有如果字典是在屬性名(沒有按沒有用,因爲字符串包含字符串,而不是字典)。

4

這看起來奇怪的(誰知道它是從哪裏來的?)

if self.__dict__ in (name): 

應該不會是

if name in self.__dict__: 

這解決您的例子

Python 3.2.3 (default, May 3 2012, 15:51:42) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import const 
>>> const.magic = 23 
>>> const.magic = 88 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "const.py", line 6, in __setattr__ 
    raise self.ConstError("Can't rebind const(%s)"%name) 
const.ConstError: Can't rebind const(magic) 

你是否真的需要這const黑客?許多Python代碼似乎以某種方式工作沒有它

+1

+1 「你真的需要這個」。 –

+0

@gnibbler謝謝,我真的不需要它,但它很高興知道。我仍然在學習任何我能。 :) – BugShotGG

+0

@gnibbler奇怪的事情。如果我嘗試在python IDLE中重新綁定它,但在eclipse中它只是重新綁定新值而沒有任何錯誤,則會出現錯誤。嗯日食或東西的bug? – BugShotGG

0

也許 kkconst - pypi是你搜索。

支持str,int,float,datetime const字段實例將保持其基本類型行爲。 和orm模型定義一樣,BaseConst是管理const字段的常量助手。

例如:

from __future__ import print_function 
from kkconst import (
    BaseConst, 
    ConstFloatField, 
) 

class MathConst(BaseConst): 
    PI = ConstFloatField(3.1415926, verbose_name=u"Pi") 
    E = ConstFloatField(2.7182818284, verbose_name=u"mathematical constant") # Euler's number" 
    GOLDEN_RATIO = ConstFloatField(0.6180339887, verbose_name=u"Golden Ratio") 

magic_num = MathConst.GOLDEN_RATIO 
assert isinstance(magic_num, ConstFloatField) 
assert isinstance(magic_num, float) 

print(magic_num) # 0.6180339887 
print(magic_num.verbose_name) # Golden Ratio 
# MathConst.GOLDEN_RATIO = 1024 # raise Error, because assignment allow only once 

更多信息使用情況,您可以閱讀的PyPI網址: pypi github

相同的答案: Creating constant in Python