Я пытаюсь инициализировать строковую переменную в Python, используя пакет datetime. Я ожидаю, что строка останется прежней, как только она будет инициализирована, но по какой-то странной причине (по крайней мере, странной для меня) она меняется.Python - String с изменением временной метки
По сути, когда я пытаюсь:
timestamp = datetime.datetime.now().strftime('%m-%d-%Y.%I_%M_%S_%p')
base_directory = "C:\\Users\\Ben\\report_" + timestamp + "\\"
print base_directory #prints C:\Users\Ben\report_02-13-2015_02_02_24_PM
time.sleep(5)
logs_directory = base_directory + "logs\\"
Когда я вернусь, чтобы использовать logs_directory переменную, я ожидаю, что это будет
C:\Users\Ben\report_02-13-2015_02_02_24_PM\logs\
Однако вместо этого:
C:\Users\Ben\report_02-13-2015_02_02_29_PM\logs\ #!!!
Это как если я получаю доступ к переменной каталога журналов, он возвращается и переоценивает base_directory переменная снова, вместо того, чтобы восстановить значение base_directory, уже установлено. Является ли это предполагаемой функциональностью в Python? Это не так, поскольку я не могу вызвать эту проблему из оболочки IDLE - это происходит только при запуске моей программы Python из pydev. Однако, если это предназначенная функциональность, как мне переписать мой код для достижения ожидаемых результатов? Благодаря!
Я не уверен, что это актуально, но я получаю доступ к этой переменной в тестах на носовые узлы. Это в Python 2.7.
ОБНОВЛЕНИЕ: Вот какой-то отдельный код, который лучше иллюстрирует, что происходит. Это делает на самом деле выглядят, как это связано с носом каким-то образом:
import nose, os, sys, time
timestamp = time.strftime('%m-%d-%Y.%I_%M_%S_%p')
base_directory = "C:\\Users\\Ben\\Desktop\\report_" + timestamp + "\\"
logs_directory = base_directory + "logs\\"
def test_me():
print base_directory
print logs_directory
if __name__ == '__main__':
os.makedirs(base_directory)
os.makedirs(logs_directory)
print base_directory
print logs_directory
time.sleep(5)
#Without the nocapture argument, nose will internally log all
#stdout output, and will not output anything to the console.
argv = (sys.argv[:])
argv.insert(1, "--nocapture")
nose.main(argv=argv) #This will run test_me()
И вот результат:
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_37_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_37_PM\logs\
я ожидал:
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\
C:\Users\Ben\Desktop\report_02-13-2015.04_27_32_PM\logs\
Что происходит? Почему нос переоценивает строки, которые уже были инициализированы? Как переписать мой код так, чтобы он выполнял то, что я ожидал? Благодаря!
Это, безусловно, не нормальное поведение. Вы не вызываете эту функцию дважды случайно? –
Нет, я нет. Это единственные места, где в коде установлены две переменные каталога.Единственное предостережение здесь в том, что я обращаюсь к переменной logs_directory из теста носовой единицы (переменные инициализируются до того, как выполняется единичный тест). Я не уверен, что есть какой-то артефакт в носу или, может быть, мой проект, который вызывает эту проблему. Я очень новичок в тестировании носа на Python. – benjammin
Строки неизменны в Python. 'base_directory' не изменится, если вы не назначили ему новую строку. Несвязанный: вы можете использовать 'time.strftime ('% m-% d-% Y.% I_% M_% S_% p')', если вы не используете директивы, которые поддерживаются только модулем datetime. Для запуска скрипта используйте обычный интерпретатор 'python'. Если проблема сохраняется, тогда [укажите кратчайшую программу, которая ее демонстрирует] (http://stackoverflow.com/help/mcve) – jfs