2010-09-29 22 views
68

Tôi đã thực hiện tìm kiếm trên Google và ở đây tại Stackoverflow nhưng không thể tìm thấy những gì tôi đang tìm kiếm.Tạo hằng số bằng mô-đun "cài đặt"?

Tôi tương đối mới đối với Python. Tôi tìm cách để tạo ra một mô-đun "cài đặt", nơi các hằng số ứng dụng cụ thể sẽ được lưu trữ.

Sau đây là cách tôi muốn thiết lập mã của tôi

settings.py

CONSTANT = 'value' 

script.py

import settings 

def func(): 
    var = CONSTANT 
    --- do some more coding --- 
    return var 

Tôi nhận được một lỗi Python nêu: "tên toàn cầu ' CONSTANT 'không được xác định.

Tôi đã nhận thấy trên mã nguồn Django của họ settings.py file ha s hằng số được đặt tên giống như tôi. Tôi đang bối rối về cách họ có thể được nhập khẩu vào một kịch bản và tham chiếu thông qua các ứng dụng.

EDIT

Cảm ơn bạn cho tất cả các câu trả lời của bạn! Tôi thử như sau:

import settings 

print settings.CONSTANT 

tôi nhận được lỗi tương tự: ImportError: không thể nhập tên CONSTANT

+4

Điều đó làm cho không giác quan. bạn sẽ nhận được một 'AttributeError' nếu' settings' không định nghĩa 'CONSTANT' và' ImportError' nếu nó không thể nhập các thiết lập, trong trường hợp này nó sẽ không nhìn vào 'CONSTANT' – aaronasterling

+0

Có điều gì đó tôi không đang làm sai rồi? – Lark

+1

Đặt hai dòng mà bạn đã đăng lần cuối vào một tệp bằng chính nó khi bạn đăng chúng và xem nó có hoạt động hay không. – aaronasterling

Trả lời

118

Cách dễ nhất để thực hiện việc này là chỉ có cài đặt làm mô-đun.

(settings.py)

CONSTANT1 = "value1" 
CONSTANT2 = "value2" 

(consumer.py)

import settings 

print settings.CONSTANT1 
print settings.CONSTANT2 

Khi bạn nhập một mô-đun python, bạn phải tiền tố các biến mà bạn kéo từ nó với các mô-đun Tên. Nếu bạn biết chính xác những gì giá trị mà bạn muốn sử dụng từ nó trong một tập tin trao bạn không phải lo lắng về việc họ thay đổi trong quá trình thực hiện, sau đó bạn có thể làm

from settings import CONSTANT1, CONSTANT2 

print CONSTANT1 
print CONSTANT2 

nhưng tôi sẽ không được mang đi với điều đó cái cuối cùng. Nó làm cho nó khó khăn cho những người đọc mã của bạn để biết giá trị đến từ đâu. và loại trừ các giá trị đó đang được cập nhật nếu mô-đun máy khách khác thay đổi chúng. Một cách thức để làm điều đó là

import settings as s 

print s.CONSTANT1 
print s.CONSTANT2 

này giúp bạn tiết kiệm gõ, sẽ tuyên truyền thông tin cập nhật và chỉ đòi hỏi độc giả phải nhớ rằng bất cứ điều gì sau khi s là từ các mô-đun cài đặt.

+0

@delnan Tôi đặc biệt tránh đề cập đến các cơ chế để không làm cho câu trả lời của bạn lỗi thời;) – aaronasterling

+0

Vâng, thực tế quá cũ;) Biết ngữ nghĩa chính xác là hữu ích và thích hợp hơn, nhưng để làm cho nó hoạt động, nó không cần thiết - mặc dù nó là cần thiết để biết những tác động của nó, được tóm tắt khá nhiều trong câu trả lời của bạn. – delnan

+3

Tôi mặc dù ý tưởng của hằng số là nó không thể thay đổi trong thời gian chạy? –

3

Để lại settings.py của bạn chính xác như nó có, sau đó bạn có thể sử dụng nó như bụi Django làm:

import settings 

def func(): 
    var = settings.CONSTANT 
5

Khi bạn import settings, một đối tượng module được gọi là settings được đặt trong không gian tên chung - và đối tượng này mang có thuộc tính settings.py làm thuộc tính. I E. bên ngoài settings.py, bạn tham khảo CONSTANTsettings.CONSTANT.

2

... Hoặc, nếu bạn thực sự muốn tất cả các hằng số từ settings.py để được nhập khẩu vào namespace toàn cục, bạn có thể chạy

from settings import * 

... nhưng nếu không sử dụng settings.CONSTANT, như tất cả mọi người khác đã đề cập ở đây, là khá đúng.

+0

Xem câu trả lời của tôi cho cả ba cách có thể để sử dụng câu lệnh 'import'. – aaronasterling

+2

Thực ra, điều này không được khuyến khích. Xem ví dụ http://docs.python.org/howto/doanddont.html#from-module-import. Mặc dù trong trường hợp này, nó có tác dụng phụ đáng mong muốn có thể thay đổi các hằng số sẽ không ảnh hưởng đến các mô-đun khác. – delnan

+2

Độc đáo nói, @AaronMcSmooth. Và về mặt kỹ thuật tôi đã không nói rằng nó được khuyến khích để nhập khẩu *, chỉ cần rằng nó đã có thể: P – ewall

1

Hãy thử điều này:

Trong settings.py:

CONSTANT = 5 

Trong tập tin chính của bạn:

from settings import CONSTANT 

class A: 
    b = CONSTANT 

    def printb(self): 
     print self.b 

Tôi nghĩ lỗi trên của bạn đến từ các tập tin cài đặt được nhập khẩu quá muộn . Đảm bảo rằng nó ở đầu tệp.

3

Xem câu trả lời tôi đã đăng lên Can I prevent modifying an object in Python? làm những gì bạn muốn (cũng như buộc sử dụng các số nhận dạng UPPERCASE). Nó thực sự có thể là một câu trả lời tốt hơn cho câu hỏi này hơn là cho câu hỏi kia.

2

Tôi mới trong python nhưng nếu chúng ta định nghĩa một hằng số như một hàm trên setings.py

def CONST1(): 
    return "some value" 

main.py

import setings 

print setings.CONST1() ##take an constant value 

đây tôi thấy chỉ có một, giá trị không thể được đã thay đổi nhưng công việc của nó giống như một chức năng ..

15

step 1: create a new file settings.py on the same directory for easier access.

#database configuration settings 

database = dict(
    DATABASE = "mysql", 
    USER  = "Lark", 
    PASS  = "" 
) 

#application predefined constants 

app = dict(
    VERSION = 1.0, 
    GITHUB = "{url}" 
) 

step 2: importing settings module into your application file.

import settings as s   # s is aliasing settings & settings is the actual file you do not have to add .py 

print(s.database['DATABASE']) # should output mysql 

print(s.app['VERSION'])   # should output 1.0 

nếu bạn không muốn sử dụng bí danh như s bạn có thể sử dụng cú pháp khác nhau

from settings import database, app 

print(database['DATABASE']) # should output mysql 

print(app['VERSION'])   # should output 1.0 

thông báo trên phương pháp nhập khẩu thứ hai bạn có thể sử dụng các tên dict trực tiếp

Một mẹo nhỏ bạn có thể nhập tất cả mã trên cài đặt tập tin bằng cách sử dụng * trong trường hợp bạn có một tập tin lớn và bạn sẽ sử dụng hầu hết các cài đặt trên nó trên ứng dụng của bạn

from settings import *  # * represent all the code on the file, it will work like step 2 


print(database['USER'])  # should output lark 

print(app['VERSION'])   # should output 1.0 

tôi hy vọng rằng sẽ giúp.

0

Cũng đáng để thử qua là dự án simple-settings cho phép bạn để nuôi các thiết lập vào kịch bản của bạn tại runtim, cho phép thiết lập môi trường cụ thể (nghĩ dev, kiểm tra, sản, ...)

Các vấn đề liên quan