†¦ существует причина, их называют "кодировкой" †¦
Немного преамбулы: думайте о unicode как о норме или идеальном состоянии. Unicode является просто таблицей символов. в „–65 является латинским капиталом A. в „–937 является греческой прописной омегой. Просто это.
Для компьютера, чтобы сохранить и - или управлять Unicode, это имеет к , кодируют это в байты. Самым простым кодирование из Unicode является UCS-4; каждый символ занимает 4 байта, и все ~1000000 символов доступны. 4 байта содержат количество символа в таблицах Unicode как 4-байтовое целое число. Другое очень полезное кодирование является UTF-8, который может закодировать любой символ Unicode одним - четырьмя байтами. Но также существует некоторая ограниченная кодировка, как "latin1", которые включают очень ограниченный диапазон символов, главным образом используемых странами Запада. Такой кодировка использование только один байт за символ.
В основном, Unicode может быть , закодировал многой кодировкой и закодировал строки, может быть , декодировал к Unicode. Вещь, Unicode прибыл довольно поздно, таким образом, все мы, которые росли с помощью 8-разрядного набор символов , узнали слишком поздно, что все это время работали с , закодировал строки. Кодирование могло быть ISO8859-1, или окнами CP437 или CP850, или, или, или, в зависимости от нашего системного значения по умолчанию.
Поэтому, в Вашем исходном коде, при вводе строки, "добавляют “Monitoring“ для списка" (и я думаю, что Вы хотели строку, "добавляют “Monitoring” для списка", отмечают вторая кавычка), Вы на самом деле уже используете строку , закодировал согласно кодовой странице Вашей системы по умолчанию (байтом \x93, я предполагаю, что Вы используете кодовую страницу 1252 Windows, “Western”). Если Вы хотите получить Unicode от этого, Вам нужно к [1 110], декодируют строка от кодирования "cp1252".
Так, то, что Вы означали делать, было:
"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")
неудачно, что Python 2.x включает .encode
метод для строк также; это - функция удобства для "специальной" кодировки, как "zip" или "rot13" или "base64", которые не имеют никакого отношения к Unicode.
Так или иначе, все необходимо помнить за Ваш туда и сюда, преобразования Unicode:
В обоих случаях, необходимо определить кодирование , который будет использоваться.
я не очень ясен, я являюсь сонным, но я верная надежда, которой я помогаю.
пз юмористическое примечание стороны: у майя не было Unicode; древние римляне, древние греки, древние египтяне сделали не также. Они все имели свою собственную "кодировку" и имели мало ни к какому уважению к другим культурам. Все эти цивилизации, которые крошат для чистки. Думайте об этом люди! Сделайте свои приложения осведомленными о Unicode, на благо человечества.:)
PS2 не портите предыдущее сообщение путем высказывания, "Но Chinese†¦". Если Вы чувствуете себя склонными, или обязанный сделать так, тем не менее, задерживают его путем размышления, что Unicode, BMP заполняется главным образом китайскими идеограммами, следовательно китайский язык, является основанием Unicode. Я могу продолжить изобретать возмутительную ложь, пока люди разрабатывают осведомленные о Unicode приложения. За Ваше здоровье!
Вы не можете сделать это с модулями, но вы можете замаскировать класс "как если "это был модуль, например, в itun.py
, код ...:
import sys
class _Sneaky(object):
def __init__(self):
self.download = None
@property
def DOWNLOAD_PATH(self):
if not self.download:
self.download = heavyComputations()
return self.download
def __getattr__(self, name):
return globals()[name]
# other parts of itun that you WANT to code in
# module-ish ways
sys.modules[__name__] = _Sneaky()
Теперь кто угодно может импортировать itun
... и фактически получить ваш itun._Sneaky ()
экземпляр. __ getattr __
предназначен для того, чтобы вы могли получить доступ ко всему остальному в itun.py
, которое может быть более удобным для вас при кодировании как объект модуля верхнего уровня,
Есть ли способ лениво назначить переменную модуля, когда она впервые или мне придется полагаться на функцию?
Я думаю, вы правы, говоря, что функция - лучшее решение вашей проблемы здесь. Я приведу вам краткий пример для иллюстрации.
#myfile.py - an example module with some expensive module level code.
import os
# expensive operation to crawl up in directory structure
Дорогостоящая операция будет выполнена при импорте, если он выполняется на уровне модуля. Невозможно остановить это, кроме ленивого импорта всего модуля !!
#myfile2.py - a module with expensive code placed inside a function.
import os
def getdownloadsfolder(curdir=None):
"""a function that will search upward from the user's current directory
to find the 'Downloads' folder."""
# expensive operation now here.
Вы будете следовать лучшим практикам, используя этот метод.
Если эта переменная находится в классе, а не в модуле, вы можете перегрузить getattr или, что еще лучше, заполнить ее в init.