Nhập một danh sách dài các hằng vào tệp Python


90

Trong Python, có một Ccâu lệnh tương tự của câu lệnh tiền xử lý chẳng hạn như ?:

#define MY_CONSTANT 50

Ngoài ra, tôi có một danh sách lớn các hằng số mà tôi muốn nhập vào một số lớp. Có sự tương tự của việc khai báo các hằng số dưới dạng một chuỗi dài các câu lệnh như trên trong một .pytệp và nhập nó vào một .pytệp khác không?

Biên tập.

Tệp Constants.pycó nội dung:

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

myExample.pyđọc:

#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""

import sys
import os

import Constants

class myExample:
    def __init__(self):
        self.someValueOne = Constants.MY_CONSTANT_ONE + 1
        self.someValueTwo = Constants.MY_CONSTANT_TWO + 1

if __name__ == '__main__':
    x = MyClass()

Biên tập.

Từ trình biên dịch,

NameError: "tên toàn cầu 'MY_CONSTANT_ONE' không được xác định"

function init in myExample tại dòng 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 bản sao đầu ra Chương trình thoát với mã # 1 sau 0,06 giây.


2
Không, không có bộ xử lý trước. Và không, bạn sẽ không đi được xa khi cố gắng viết mã C bằng Python, hoặc thậm chí cố gắng tìm các điểm tương đồng.

Đó không phải là sự truy ngược đầy đủ. Bạn đang chạy nó như thế nào? python myExample.pynên đưa ra một dấu vết về lỗi bao gồm tên tệp và <module>ở mức cao nhất. Thêm vào đó, các tham chiếu MY_CONSTANT_ONE không phải là một tên toàn cầu - thực sự kỳ lạ. Kiểm tra kỹ lưỡng xem đó có thực sự là những tệp bạn đang chạy (và có thể chuyển đổi chúng thành ASCII và loại bỏ # encoding: utf8bit).

@All: Cảm ơn, hiện tại tôi có vẻ ổn - vẫn chưa chắc tại sao, nhưng đừng bận tâm :).
SK9

Câu trả lời:


131

Python không được xử lý trước. Bạn chỉ có thể tạo một tệp myconstants.py:

MY_CONSTANT = 50

Và nhập chúng sẽ chỉ hoạt động:

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9: Chà, hiển thị mã chính xác bạn đang chạy (cả mô-đun xác định và sử dụng).

@Thomas: Xem ở trên. Tôi chắc chắn đã bỏ lỡ một số điều gì đó trong khi tôi đang học những điều cơ bản.
SK9

@ SK9: Không có lỗi như vậy trong mã bạn đăng. Tôi đã kiểm tra nó nhiều lần và tự chạy nó, nó hoạt động tốt. Nó thậm chí không thể dẫn đến lỗi này (không có tham chiếu đến tên MAX_FIVE_FLUSH_KEY_INT). Đăng bản ghi lại.

@Thomas: Cảm ơn bạn đã thử nghiệm cái này. Rất tiếc, tôi sẽ thử lại. (Tham chiếu ám chỉ là lỗi đánh máy.) Bạn đã thử các tệp theo đúng nghĩa đen? (Tôi sao chép và dán đầy đủ các nội dung trên.)
SK9

@ SK9: Tôi không phải Thomas;) Và vâng, tôi đã sao chép và dán mọi thứ, thậm chí tôi còn để nguyên tên tệp. Một lần nữa, theo dõi sẽ giúp chúng tôi gỡ lỗi.

18

Python không có bộ tiền xử lý, cũng không có hằng số theo nghĩa là chúng không thể thay đổi - bạn luôn có thể thay đổi (gần như, bạn có thể mô phỏng các thuộc tính đối tượng không đổi, nhưng làm điều này vì lợi ích của hằng số thì hiếm khi thực hiện và không được coi là hữu ích) mọi thứ. Khi định nghĩa một hằng số, chúng tôi xác định một cái tên có chữ hoa-chữ-thường và dấu gạch dưới và gọi nó là một ngày - "Chúng tôi đều đồng ý với người lớn ở đây", không một người đàn ông lành mạnh nào lại thay đổi một hằng số. Tất nhiên, trừ khi anh ấy có lý do chính đáng và biết chính xác những gì anh ấy đang làm, trong trường hợp đó bạn không thể (và có thể là không nên) ngăn cản anh ấy theo cách nào.

Nhưng tất nhiên bạn có thể xác định tên cấp mô-đun với một giá trị và sử dụng nó trong mô-đun khác. Điều này không dành riêng cho hằng số hay bất cứ thứ gì, hãy đọc trên hệ thống mô-đun.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

Và tất nhiên bạn có thể làm:

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
import * nói chung không được khuyến khích, nhưng hằng số tệp kê khai kiểu C được sử dụng rộng rãi trên một cơ sở mã là một trong những nơi không nên dùng nó. Đặt tên chúng trong ALL_CAPS hoặc với một số quy ước tiền tố để giảm khả năng va chạm với các ký hiệu khác sẽ loại bỏ sự phản đối chính đối với thành ngữ và nếu xảy ra va chạm, bạn luôn có thể quay trở lại kiểu nhập thông thường + tên rõ ràng (nhập a; a .MY_CONSTNAT), không giống như ở C.
Russell Borogove

cũng a.MY_CONSTNAT chậm hơn một chút, đó là bởi vì thông dịch tìm kiếm trong một không gian tên cho tên 'a' và sau đó trong một tên kẻ thù thứ hai 'MY_CONSTNAT'
tony

7

Chắc chắn, bạn có thể đặt các hằng số của mình vào một mô-đun riêng biệt. Ví dụ:

const.py:

A = 12
B = 'abc'
C = 1.2

main.py:

import const

print const.A, const.B, const.C

Lưu ý rằng khi được công bố trên, A, BClà các biến, tức là có thể thay đổi tại thời gian chạy.


5

Hãy thử xem Tạo hằng số bằng mô-đun "cài đặt"? Tôi có thể ngăn sửa đổi một đối tượng trong Python không?

Một liên kết hữu ích khác: http://code.activestate.com/recipes/65207-constants-in-python/ cho chúng tôi biết về tùy chọn sau:

from copy import deepcopy

class const(object):

    def __setattr__(self, name, value):
        if self.__dict__.has_key(name):
            print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
            return deepcopy(self.__dict__[name])
        self.__dict__[name] = value

    def __getattr__(self, name, value):
        if self.__dict__.has_key(name):
            return deepcopy(self.__dict__[name])

    def __delattr__(self, item):
        if self.__dict__.has_key(item):
            print 'NOOOOO' # throw exception if needed

CONST = const()
CONST.Constant1 = 111
CONST.Constant1 = 12
print a.Constant1 # 111
CONST.Constant2 = 'tst'
CONST.Constant2 = 'tst1'
print a.Constant2 # 'tst'

Vì vậy, bạn có thể tạo một lớp như thế này và sau đó nhập nó từ mô-đun contants.py. Điều này sẽ cho phép bạn chắc chắn rằng giá trị đó sẽ không bị thay đổi, bị xóa.


Cám ơn vì cái này. Trước khi hỏi trên SO, tôi đã tìm kiếm và tìm thấy cả hai. :)
SK9

@ SK9 oh, xin lỗi vì trùng lặp sau đó
Artsiom Rudzenka

4

Để thay thế cho việc sử dụng phương pháp nhập được mô tả trong một số câu trả lời, hãy xem mô-đun configparser .

Lớp ConfigParser triển khai một ngôn ngữ phân tích cú pháp tệp cấu hình cơ bản cung cấp cấu trúc tương tự như những gì bạn sẽ tìm thấy trên các tệp Microsoft Windows INI. Bạn có thể sử dụng điều này để viết các chương trình Python có thể được tùy chỉnh bởi người dùng cuối một cách dễ dàng.


2

Nếu bạn thực sự muốn các hằng số, không chỉ các biến trông giống như hằng số, thì cách tiêu chuẩn để làm điều đó là sử dụng từ điển bất biến. Thật không may, nó chưa được tích hợp sẵn, vì vậy bạn phải sử dụng công thức nấu ăn của bên thứ ba (như cái này hay cái kia ).


2

tạo tệp hằng số với bất kỳ tên nào như my_constants.py khai báo hằng số như vậy

CONSTANT_NAME = "SOME VALUE"

Để truy cập hằng số trong tệp nhập mã của bạn như vậy

import my_constants as constant

và truy cập giá trị không đổi dưới dạng:

constant.CONSTANT_NAME
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.