แนวปฏิบัติที่ดีที่สุดในการใช้ไฟล์การตั้งค่าใน Python คืออะไร [ปิด]


332

ฉันมีสคริปต์บรรทัดคำสั่งที่ฉันทำงานด้วยข้อโต้แย้งมากมาย ตอนนี้ฉันมาถึงจุดที่ฉันมีข้อโต้แย้งมากเกินไปและฉันต้องการมีข้อโต้แย้งในรูปแบบพจนานุกรมด้วย

ดังนั้นเพื่อลดความซับซ้อนของสิ่งที่ฉันต้องการเรียกใช้สคริปต์ด้วยไฟล์การตั้งค่าแทน ฉันไม่รู้จริงๆว่าควรใช้ไลบรารี่ใดในการแยกวิเคราะห์ไฟล์ การปฏิบัติที่ดีที่สุดในการทำสิ่งนี้คืออะไร แน่นอนฉันสามารถทุบบางสิ่งบางอย่างออกมาเอง แต่ถ้ามีห้องสมุดสำหรับเรื่องนี้ฉันหูทั้งหมด

'ความต้องการ' ไม่กี่:

  • แทนที่จะใช้pickleฉันต้องการให้เป็นไฟล์ข้อความที่สามารถอ่านและแก้ไขได้อย่างง่ายดาย
  • ฉันต้องการที่จะสามารถเพิ่มข้อมูลเหมือนพจนานุกรมลงในแผ่นงานได้เช่นรูปแบบการซ้อนควรได้รับการสนับสนุน

ไฟล์ตัวอย่างหลอกง่าย:

truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2

6
ไวยากรณ์เฉพาะของไฟล์ตัวอย่างนี้เป็น YAML ตรวจสอบคำตอบของ Benson
Skippy le Grand Gourou

คำตอบ:


231

คุณสามารถมีโมดูล Python ปกติพูด config.py ดังนี้:

truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

และใช้มันเช่นนี้

import config
print config.truck['color']  

69
นี่เป็นแนวคิดที่ไม่ดีเลยทีเดียวหากคุณต้องการให้ผู้ใช้ที่มีสิทธิ์ต่ำสามารถเปลี่ยนไฟล์การกำหนดค่าได้เท่านั้นวิธีนี้คุณจะอนุญาตให้พวกเขาแอบเข้าไปในรหัสที่ได้รับการยกเว้น
nikolay

172
การอนุญาตให้ผู้ใช้ที่ "สิทธิพิเศษต่ำ" เปลี่ยนการกำหนดค่าสำหรับโปรแกรมที่มีสิทธิพิเศษมากกว่านั้นอาจเป็นการตั้งค่าที่น่าสงสัยอยู่ดี
XTL

18
นอกจากนี้คุณยังอาจพบปัญหาการบรรจุโครงการของคุณสำหรับการปรับใช้โดยใช้เครื่องมือเช่น py2app ผู้ใช้อาจไม่สามารถแก้ไขไฟล์กำหนดค่าเมื่อมีการเผยแพร่เนื่องจากจะทำให้ลายเซ็นของแอปใช้ไม่ได้
bschwagg

18
ข้อเสียเปรียบหลักกับเรื่องนี้ (ตัวเลือกอย่างอื่นที่สะดวกสบายมาก) คือว่า.pyไฟล์ปฏิบัติการดังนั้นชนิดของรหัสใด ๆ importอาจจะทำงานในขณะที่พยายามที่จะโหลดการกำหนดค่าผ่านทาง ไม่สามารถยอมรับได้จากมุมมองด้านความปลอดภัย
Apalala

5
ไม่สามารถทำเวอร์ชันนี้ได้อย่างปลอดภัยด้วยast.literal_evalใช่ไหม docs.python.org/3/library/ast.html#ast.literal_eval
André C. Andersen

169

กำหนดค่าตัวอย่างที่คุณให้ถูกต้องจริงYAML ในความเป็นจริง YAML ตอบสนองทุกความต้องการของคุณมีการใช้งานในหลายภาษาและเป็นมิตรกับมนุษย์อย่างยิ่ง ฉันอยากจะแนะนำให้คุณใช้มัน โครงการ PyYAMLให้โมดูลหลามดีว่าการดำเนินการ YAML

ในการใช้โมดูล yaml นั้นง่ายมาก:

import yaml
config = yaml.safe_load(open("path/to/config.yml"))

3
มันคืออะไรบางอย่างที่ฉันหันไปหา รูปแบบอาจมาจากความเรียบง่ายไปจนถึงการสนับสนุนโค้ดไพ ธ อนที่ฝังอยู่และไลบรารี่มาตรฐานจะยกการแยกวิเคราะห์และการสุขาภิบาลอย่างหนักสำหรับคุณ
Todor Minakov

15
ตกลง สำหรับคุณหรือผู้ใช้เขียน YAML, นี่คือการอ้างอิง YAML ที่ดีที่สุดที่ฉันรู้ เอกสารอย่างเป็นทางการเป็นที่น่าเสียดายข้อมูลจำเพาะที่มีวัตถุประสงค์เพื่อพัฒนาระบบและไม่มีอะไรอื่น แต่คู่มือ Eevee เป็นที่ยอดเยี่ยม
Esteis

5
สำหรับเราที่ไม่ได้ฝึกหัดนั่นคือpip3 install pyyamlเพื่อให้พร้อมที่จะนำเข้าสู่สคริปต์หลาม
user8675309

2
ระวัง yaml นั้นเป็นมิตรถ้าคุณทำให้มันง่ายมากโดยค่าเริ่มต้นมีปัญหามากมายติดกับฟีเจอร์ที่ไม่ปลอดภัย ลองhitchdev.com/strictyamlแทนทางเลือก lite ที่ปลอดภัยโดยค่าเริ่มต้น
Gringo Suave

107

ฉันพบสิ่งนี้มีประโยชน์มากที่สุดและใช้งานง่าย https://wiki.python.org/moin/ConfigParserExamples

คุณเพิ่งสร้าง "myfile.ini" เช่น:

[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

และดึงข้อมูลเช่น:

>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'

20
สำหรับ Python 3 ให้ใช้โมดูลconfigparserแทน (ตัวพิมพ์เล็กทั้งหมด)
Roland

2
นี่เป็นวิธีที่เร็วที่สุดชัดเจนและง่ายที่สุดในการใช้งานโซลูชันเนื่องจากไม่มีการนำไปใช้งานเพียงแค่ใช้งาน :) ขอบคุณ!
Aleksandar

สิ่งนี้จะสนับสนุนพจนานุกรมที่ซ้อนกันตามที่ถามในคำถามหรือไม่
Jakub Bláha

54

Yaml และ Json เป็นรูปแบบไฟล์ที่ง่ายและใช้กันมากที่สุดในการจัดเก็บการตั้งค่า / กำหนดค่า PyYaml สามารถใช้ในการแยก yaml Json เป็นส่วนหนึ่งของ python อยู่แล้วจาก 2.5 Yaml เป็นซูเปอร์เซ็ตของ Json Json จะแก้ปัญหากรณีการใช้งานส่วนใหญ่ยกเว้นสตริงหลายบรรทัดที่จำเป็นต้องใช้การยกเว้น Yaml ก็ดูแลกรณีเหล่านี้ด้วย

>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))   
{u'handler': u'adminhandler.py', u'timeoutsec': 5}

13
ในขณะที่เทียบเท่ามากขึ้นหรือน้อยลง json ไม่ได้เกือบเป็นมนุษย์อ่านได้เป็น yaml เนื่องจากการกำหนดค่าตัวอย่างของเขาเป็น yaml ที่ถูกต้องจริง ๆ ฉันจึงเน้นว่าแทนที่จะเป็น json
Benson

23
การใช้ "json.dump (config, fp, sort_keys = True, เยื้อง = 4)" ช่วยเพิ่มความสามารถในการอ่าน
phobie

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.