我有這個配置文件,我有統計數據:迭代次數和時間增量對象。我正試圖找到評估這個值的pythonic和安全的方法。 所以配置文件看起來像這樣(test_config.cfg):從配置文件獲取時間增量值的正確方法
[Section]
option1 = (6, datetime.timedelta(0, 9, 520000))
option2 = (4, datetime.timedelta(0, 8, 510000))
該條目time.timedelta()
到達那裏時,我使用RawConfigParser.set('Section', 'option', (i, t_delta))
其中t_delta
,簡直是兩個操作和i
之間的時間跨度是迭代的次數。當從配置中讀取這些值時,它們將作爲字符串返回。我想評估他們最初的樣子。我曾嘗試和作品,但我覺得必須有這樣做的更安全,respectivelly Python的方式:
import ConfigParser
import datetime
config = ConfigParser.RawConfigParser()
config.read('test_config.cfg')
stats = config.get('Section', 'option1')
# The obvious way is with eval() but makes me very uncomfortable using it
iterations = eval(stats)[0] # 6
duration = eval(stats)[1] # 0:00:09.520000
# The ugly way is with stripping and splitting
duration_tuple = tuple(int(i) for i in stats.split('(')[-1].strip(')').split(','))
duration = datetime.timedelta(*duration_tuple)
iterations = int(stats.split(',')[0].lstrip('('))
print iterations # 6
print duration # 0:00:09.520000
那麼,有沒有更好的辦法?最終是否有一種方法,讓設置到配置時只有timedelta對象使用的「元組」?像(0, 9, 520000)
而不是datetime.timedelta(0, 9, 520000)
。這樣我就可以輕鬆使用ast.literal_eval()
。謝謝!
感謝't_delta.total_seconds()'的一部分,但我仍需要使用ast.literal_eval( )這是可以的,因爲float(stats [1])部分不起作用,因爲它仍然是一個字符串,所以stats [1]將是6,stats [0]將是'('。 – skamsie
@HerrActress:apply'ast .literal_eval'到整個字符串:'stats = ast.literal_eval('(6,9.520000)')'。 – unutbu
是的,這絕對是我在找的。謝謝。理想情況下,我也會用' ast.literal_eval'部分爲後代:) – skamsie