jak z funkcji Python-a zwrócić dużą strukturę danych?

0

Jestem początkujący i jak w tytule. Mam problem jak zwrócić z funkcji strukturę typu np słownik. Napotkałem na ten problem gdy chciałem po przetworzeniu zwrócić dane zaczytane z pliku.

2

Gdzie jest twój kod? Co znaczy "dużą strukturę danych"?
Pytanie jest jest niejasne i ogólne, że niemożliwe do odpowiedzi (bez pisania książki).
Jako, że jeteś początkujący, to napisałeś mały kod. Wklej go całego na forum i wyjaśnij co i dlaczego ci nie działa.

1

Co według ciebie oznacza "duża"?

0

Chodzi konkretnie o słownik. Jego rozmiar jest bliżej nieokreślony ale może mieć i kilkaset pozycji. W necie nie znalazłem takiego przykładu. Jak będę wiedział jak zwrócić słownik to z innymi strukturami danych sobie poradzę. Dodam, iż funkcję wołam z nazwą pliku a zwracam zaczytane dane konfiguracyjne w słowniku.

tutaj druga funkcja podobna zaczytująca do słownika linię wywołania:


def command_line_parse():
    print(">>>> command_line_parse")   
    call_in_table = {}
    paramcount=len(sys.argv)
    for param_index in range(0,paramcount):
        param_string=sys.argv[param_index]
        param_list=param_string.split("=")
        param_name=param_list[0]
        if len(param_list)>1:
            param_val=param_list[1] # wykonaj dla podania parametru
        else:
            param_val="-1"          # wykonaj dla podania switch-a
        call_in_table[param_name]=param_val
 
    if 1!=paramcount:
        print("Błędna liczba parametrów wywołania")
        
    else:
        print("poprawna liczba parametrów wywołania")
     
     #return call_in_table
3
return duża_struktura_danych

Wiele więcej nie zdziałasz, Python ogólnie i tak co do zasady przekazuje przez referencję.

0

Mam tak zrobione gdyż się domyślałem iż może tak to działać dlatego ta zakomentowana linia:
#return call_in_table
lecz mam błąd i spyder też mi to sygnalizował:
IndentationError: unindent does not match any outer indentation level

1
qazpylades napisał(a):

Mam tak zrobione gdyż się domyślałem iż może tak to działać dlatego ta zakomentowana linia:

#return call_in_table
lecz mam błąd i spyder też mi to sygnalizował:
IndentationError: unindent does not match any outer indentation level

To jest jedna z podstawowych cech python-a.
Bloki kodu oznacza się wcięciami z przodu linii.
Jeśli spacje/tabulatory nie zgadzają się ze wcześniejszą linią, to zgłaszany jest ten błąd. Zwykły błąd składniowy.
Najczęściej jest to wynik wymieszania spacji i tabulatorów.
Ty chyba po prostu dałeś o jedna spację za dużo.

0

Masz rację. Przyjąłem iż strawi wcięcie a nie myślałem, iż ta jedna spacja zaważy i to się zemściło.
Dzięki za pomoc.

1

@qazpylades: Spraw sobie porządne IDE, np, VSCode, albo Pycharm, ogarną Ci wcięcia. Gdybyś chciał operować naprawdę dużymi strukturami danych, to rozważ użycie generatorów.
https://docs.python.org/3/c-api/gen.html
https://realpython.com/introduction-to-python-generators/

0

W Pythonie jestem początkujący. Zwykle śmigam C, C++ +asm na uk gdzie jestem zaawansowany. Nie omieszkam się skorzystać z dobrej rady.
Po prostu skorzystałem z tego co było pod ręką na Debianie. Niewątpliwie przejdę w ciągu miesiąca do wxWidgets i OpenCV więc te porady są przydatne.

Dodatkowe pytanko jak uruchomić zewnętrzny program ze skryptu i odebrać jego wynik?
Piszę taki GPL-owy skrypt który na podstawie include będzie przeszukiwał kody, i generował makefile i go wywoływał. generalnie kompilacja programów na C wyglądać ma:
maker main.c
i wszystko w nosie...

0

W Pythonie przede wszystkim nie zwracasz struktur (w sensie kopiowania, jak w C++) -- wszystko działa na wskaźnikach, więc zwracasz wskaźnik i tyle.
return coś
-- żadna więcej filozofia...

0

Dodatkowe pytanko jak uruchomić zewnętrzny program ze skryptu i odebrać jego wynik?

import subprocess

subprocess.run(["echo", "python jest lepszy od C++, nie programuj w C++"])
python3 test.py | sed 's/lepszy/duzo lepszy'
0

@m94: Dzięki za wskazanie biblioteki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1