Python ConfigParser - оценивает между кавычками

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

Редактирование

Не уверенный, почему люди являются downvoting это, но это - актуальный вопрос и было сделано, прежде чем op разъяснил его вопрос, и это - самая фундаментальная основная причина структуры.

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

13
задан SilentGhost 21 August 2009 в 11:16
поделиться

4 ответа

Извините, решение тоже было тривиальным - я могу просто оставить кавычки, похоже, python просто принимает правую часть знака равенства.

4
ответ дан 1 December 2019 в 22:07
поделиться

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

>>> s = '"hello world"'
>>> s
'"hello world"'
>>> s.strip('"')
'hello world'
>>> s2 = "foo"
>>> s2.strip('"')
'foo'

Как видите, .strip не изменяет строку, если она не начинается и не заканчивается указанной строкой.

12
ответ дан 1 December 2019 в 22:07
поделиться

Дэйви,

Как вы говорите, вы можете просто оставить кавычки вне своей строки.

Для проекта, над которым я работаю, я хотел иметь возможность представлять практически любую строку Python literal в качестве значения для некоторых из моих параметров конфигурации и более того, я хотел иметь возможность обрабатывать некоторые из них как необработанные строковые литералы. (Я хочу, чтобы эта конфигурация могла обрабатывать такие вещи, как \ n, \ x1b и т. Д.).

В этом случае я использовал что-то вроде:

def EvalStr(s, raw=False):
    r'''Attempt to evaluate a value as a Python string literal or
       return s unchanged.

       Attempts are made to wrap the value in one, then the 
       form of triple quote.  If the target contains both forms
       of triple quote, we'll just punt and return the original
       argument unmodified.

       Examples: (But note that this docstring is raw!)
       >>> EvalStr(r'this\t is a test\n and only a \x5c test')
       'this\t is a test\n and only a \\ test'

       >>> EvalStr(r'this\t is a test\n and only a \x5c test', 'raw')
       'this\\t is a test\\n and only a \\x5c test'
    '''

    results = s  ## Default returns s unchanged
    if raw:
       tmplate1 = 'r"""%s"""'
       tmplate2 = "r'''%s'''"
    else:
       tmplate1 = '"""%s"""'
       tmplate2 = "'''%s'''"

    try:
       results = eval(tmplate1 % s)
     except SyntaxError:
    try:
        results = eval(tmplate2 %s)
    except SyntaxError:
        pass
    return results

... который, я думаю, будет обрабатывать все, что не содержат строки в тройных одинарных и тройных двойных кавычках.

(Этот случай выходит за рамки моих требований).

Здесь, на SO, есть странность этого кода; подсветчик синтаксиса сбивает с толку тот факт, что моя строка документации представляет собой необработанную строку. Это было необходимо, чтобы doctest был доволен этой конкретной функцией).

0
ответ дан 1 December 2019 в 22:07
поделиться
import ConfigParser

class MyConfigParser(ConfigParser.RawConfigParser):
    def get(self, section, option):
        val = ConfigParser.RawConfigParser.get(self, section, option)
        return val.strip('"')

if __name__ == "__main__":
    #config = ConfigParser.RawConfigParser()
    config = MyConfigParser()

    config.read(["example.cfg"])
    print config.get('GENERAL', 'onekey') 
6
ответ дан 1 December 2019 в 22:07
поделиться
Другие вопросы по тегам:

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