Jaki jest najprostszy format pliku konfiguracyjnego czytelnego dla człowieka? [Zamknięte]

13

Aktualny plik konfiguracyjny wygląda następująco:

mainwindow.title = 'test'
mainwindow.position.x = 100
mainwindow.position.y = 200

mainwindow.button.label = 'apply'
mainwindow.button.size.x = 100
mainwindow.button.size.y = 30

logger.datarate = 100
logger.enable = True
logger.filename = './test.log'

Jest to odczytywane z pythonem do zagnieżdżonego słownika:

{
  'mainwindow':{
    'button':{
      'label': {'value':'apply'},
       ...
  },
  'logger':{
     datarate: {'value': 100},
     enable: {'value': True},
     filename: {'value': './test.log'}
  }, 
  ...    
}

Czy jest na to lepszy sposób? Chodzi o to, aby uzyskać zachowanie typu XML i unikać XML tak długo, jak to możliwe. Zakłada się, że użytkownik końcowy jest prawie całkowicie niepiśmienny i zasadniczo używa notatnika i kopiuj-wklej. Dlatego standardowy typ „nagłówka + zmiennych” w języku Python jest uważany za zbyt trudny.

Fikcyjny użytkownik edytuje plik konfiguracyjny, zdolni programiści obsługują słowniki. Słownik zagnieżdżony został wybrany w celu łatwego podziału (program rejestrujący nie potrzebuje, a nawet nie może mieć / edytować parametrów okna głównego).

Juha
źródło
11
Absolutnie najprostszym byłoby zbudowanie klienta małej aplikacji, która nie robi nic poza edycją tych plików konfiguracyjnych.
Patrick Hughes
11
Najprostszym plikiem konfiguracyjnym dla ludzi jest: Do what I want.Najtrudniejszy dla komputerów: P
Sjoerd
@PatrickHughes Myślę, że już istnieje. Czy znasz taki program? Nie chciałbym poświęcać czasu na zwykłe „ładne drukowanie” prostych rzeczy. Problem polega na tym, że dodanie małych przerw w programie wymaga więcej. Mam na myśli, że każdy komputer ma vim, SMS-y lub notatnik.
Juha
@sjoerd To właśnie chciałem wiedzieć. Czy w tym sensie istnieją algorytmy bardziej związane z ludzkim językiem niż programami?
Juha
2
Użytkownicy mogą wszystko zepsuć. Jeśli zamierzają edytować go ręcznie, przygotuj się na wsparciemainwindow.title =='test"
MSalters

Odpowiedzi:

15

Możesz użyć czegoś takiego jak YAML . Oto link do przykładu:

http://www.yaml.org/start.html

--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
    given  : Chris
    family : Dumars
    address:
        lines: |
            458 Walkman Dr.
            Suite #292
        city    : Royal Oak
        state   : MI
        postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
    - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

Powiązania Pythona można znaleźć w PyYAML . Jest trochę bardziej przyjazny dla użytkownika niż JSON (tak wygląda twój drugi przykład).

jmq
źródło
10
YAML jest elegancki, ale zdecydowanie nie najprostszy.
9000
1
Najprościej pomyślałem w kontekście jego pytania: „uzyskaj zachowanie XML i unikaj XML tak długo, jak to możliwe”. Nie jestem pewien niczego prostszego, spełniając ten wymóg.
jmq
hmm, więc to mój pierwszy blok kodu YAML, jeśli zmienię „.” i „=” na „:” i stracisz aphostropes? Jest trochę zbędnych danych, ale to od użytkownika zależy, który zapis najbardziej mu się podoba.
Juha
3
Jestem dość niektórych użytkowników nietechnicznych zamiar dostać w niepowołane wcięcia - nie mówiąc już o bardziej skomplikowane rzeczy, jak na >PO comments:, a &i *przedid001
Izkata
6

Najlepszą rzeczą, jaką możesz zrobić, to wykonać makietę swojego rozwiązania, a być może makietę kilku innych rozwiązań i poprosić dwóch lub trzech reprezentatywnych użytkowników twojego systemu. Będą dużo lepiej mówić ci, co lubią, niż osoby wybrane przez siebie, które odpowiadają na pytania na tej stronie.

Biorąc to pod uwagę, myślę, że dla użytkowników „w zasadzie analfabetów komputerowych” format, który wyświetlasz w pytaniu, jest prawdopodobnie najlepszym formatem zwykłego tekstu. Jeśli naprawdę są niepiśmienni, możesz rozważyć prosty GUI, aby nie musieli ręcznie edytować plików konfiguracyjnych.

Bryan Oakley
źródło
3

Strać wszystko, co możesz stracić. name.name.name=value, każda w osobnej linii, jest tak prosta, jak to tylko możliwe. Nie potrzebujesz cudzysłowów do parsowania, wiesz, kiedy trueto boolean, a kiedy trueciąg znaków, nie zmuszaj „głupiego człowieka”, żeby ci to powiedział. W przypadku łańcuchów, jeśli pole nie powinno mieć początkowych / końcowych spacji, usuń je sam.

Ross Patterson
źródło
3

Wyobraź sobie Chińczyka, który nie zna angielskiego, który próbuje odczytać plik konfiguracyjny. Alternatywnie, wyobraź sobie, że plik konfiguracyjny jest w języku arabskim (i że nie znasz arabskiego). Teraz zadaj sobie pytanie, czy to naprawdę czytelne dla człowieka?

Nawet jeśli czytelnik zna angielski, nadal nie ma pojęcia, czy „logger.datarate = 100” oznacza 100 znaków na sekundę, 100 GiB na godzinę lub 100 kurczaków na tonę metryczną.

Najbardziej czytelnym dla człowieka formatem pliku jest plik binarny z przyzwoitym oknem dialogowym / kreatorem / konfiguratorem opartym na GUI (z internacjonalizacją, systemem pomocy itp.).

Brendan
źródło
2

Jestem z Patrickiem Hughes. Zbuduj prostą aplikację do edycji konfiguracji. Sam plik konfiguracyjny może być nieco bardziej złożony i może zawierać atrybuty do użycia przez edytor (nazwa wyświetlana, tekst pomocy, typ wartości, wartość min./maks. Itp.).

Misko
źródło
1
Problem polega na tym, że aplikacja musi obsługiwać osx, win i ubuntu oraz mieć dostęp do systemu plików. Więc moją jedyną alternatywą jest statyczny plik wykonywalny Pythona (i wx dla natywnego wyglądu). A może są inne języki? Czy potrafisz tworzyć statyczne pliki wykonywalne Java?
Juha
Aplikacja QT byłaby w twoim przypadku prostym i zgodnym rozwiązaniem
Ryga
2

Mówię, że to, co masz (plik właściwości) jest już najlepszym formatem konfiguracji czytelnym dla człowieka. :)

Oto moje argumenty:

  • Plik właściwości to tylko para klucz / wartość. Łatwo czytelny dla człowieka.
  • Skrócona składnia, a nie xml.
  • Łatwe do zagnieżdżenia, z „.”, Jak w twoim przykładzie.
  • Płaska konstrukcja pozwala na łatwe różnicowanie w środowisku kontrolowanym przez źródło.

Ten ostatni punkt jest właściwie bardzo ważny. Biorąc pod uwagę, że obecnie wszystkie projekty są podzielone na gałęzie, plik konfiguracyjny może powodować mnóstwo bólu podczas łączenia gałęzi. Płaski format pliku, taki jak plik właściwości, jest łatwiejszy do scalenia niż plik struktury drzewa.

ming_codes
źródło