Ленивые переменные модуля - это может быть сделано?

†¦ существует причина, их называют "кодировкой" †¦

Немного преамбулы: думайте о 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 добирается , закодировал к строке Python 2.x (на самом деле, последовательность байтов)
  • , строка Python 2.x добирается , декодировал к строке Unicode

В обоих случаях, необходимо определить кодирование , который будет использоваться.

я не очень ясен, я являюсь сонным, но я верная надежда, которой я помогаю.

пз юмористическое примечание стороны: у майя не было Unicode; древние римляне, древние греки, древние египтяне сделали не также. Они все имели свою собственную "кодировку" и имели мало ни к какому уважению к другим культурам. Все эти цивилизации, которые крошат для чистки. Думайте об этом люди! Сделайте свои приложения осведомленными о Unicode, на благо человечества.:)

PS2 не портите предыдущее сообщение путем высказывания, "Но Chinese†¦". Если Вы чувствуете себя склонными, или обязанный сделать так, тем не менее, задерживают его путем размышления, что Unicode, BMP заполняется главным образом китайскими идеограммами, следовательно китайский язык, является основанием Unicode. Я могу продолжить изобретать возмутительную ложь, пока люди разрабатывают осведомленные о Unicode приложения. За Ваше здоровье!

31
задан wbg 13 October 2009 в 23:21
поделиться

3 ответа

Вы не можете сделать это с модулями, но вы можете замаскировать класс "как если "это был модуль, например, в 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 , которое может быть более удобным для вас при кодировании как объект модуля верхнего уровня,

57
ответ дан 27 November 2019 в 21:38
поделиться

Есть ли способ лениво назначить переменную модуля, когда она впервые или мне придется полагаться на функцию?

Я думаю, вы правы, говоря, что функция - лучшее решение вашей проблемы здесь. Я приведу вам краткий пример для иллюстрации.

#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.

Вы будете следовать лучшим практикам, используя этот метод.

4
ответ дан 27 November 2019 в 21:38
поделиться

Если эта переменная находится в классе, а не в модуле, вы можете перегрузить getattr или, что еще лучше, заполнить ее в init.

1
ответ дан 27 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: