JanaEsther / programovani-v-pythonu-zima-2024

0 stars 0 forks source link

Domácí úkol 2 mám hotový #2

Open JanaEsther opened 4 months ago

JanaEsther commented 4 months ago

@pesikj Ahoj Jirko, mám hotový druhý domácí úkol. Prosím, podívej se na to, až budeš mít čas. Budu ráda za každou připomínku, co bych mohla zlepšit. Díky moc.

pesikj commented 4 months ago

Ahoj @JanaEsther , úkol je zpracovaný moc hezky a včetně bonusu. Mám pár komentářů, dám ti je sem.

import requests
import json
import sys

ico= input("Zadejte IČ subkjektu, který Vás zajímá:\n")
headers = {
    'accept': 'application/json',
}

response = requests.get(f"https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/{ico}")

if response.text and response.status_code == 200:
    data = response.json()
else:
    # Větev a exit zajistí, že program nespadne na name error, pokud se vrátí jiný kód než 200
    print("Firma nebyla nalezena nebo služba není dostupná.")
    sys.exit()

obchodniJmeno = data.get('obchodniJmeno')
# Tohle je super, ale myslím, že by bylo fajn přidat nepovinný parametr i pro druhý get, aby to v případě
# nenalezení adresy nevrátílo prázdný řetězec
textovaAdresa = data.get('sidlo', {}).get('textovaAdresa', "")

print( f"{obchodniJmeno} \n{textovaAdresa}")

def find_legal_form(code, items):
    for item in items:
        if item['kod'] == code:
            # API data vrací jako seznam. Popravdě nevím proč, protože to vrací data stejně jen v češtěině. Ale jiný jazyk jde možná nějak zapnout
            # Ale z toho seznamu si můžeš vytáhnout položku na pozici 0 a k ní název, takže v tom výpisu neuvidíš další informace navíc (jako jazykový kód atd.)
            return item['nazev'][0]["nazev"]
    return None

# Získání číselníku právních forem

headers = {
    "accept": "application/json",
    "Content-Type": "application/json",
}
# Tady je super, že ta data načítáš jen jednou. Kdybys to chtěla dělat opakovaně pro každý nalezený subjekt, tak to bude hodně pomalé
data = '{"kodCiselniku": "PravniForma", "zdrojCiselniku": "res"}'
res = requests.post("https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ciselniky-nazevniky/vyhledat", headers=headers, data=data)
ciselnik = res.json()['ciselniky'][0]['polozkyCiselniku']

# Získání názvu subjektu od uživatele
nazev_subjektu = input("Zadejte název subjektu, který chcete vyhledat: ")

# Vyhledání subjektů
data = json.dumps({"obchodniJmeno": nazev_subjektu})
res = requests.post("https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ekonomicke-subjekty/vyhledat", headers=headers, data=data)
subjekty = res.json()

# Výpis nalezených subjektů
print(f"Nalezeno subjektů: {subjekty['pocetCelkem']}")
for subjekt in subjekty['ekonomickeSubjekty']:
    pravni_forma = find_legal_form(subjekt['pravniForma'], ciselnik)
    print(f"{subjekt['obchodniJmeno']}, {subjekt['ico']}, {pravni_forma}")
JanaEsther commented 4 months ago

@pesikj Děkuju moc za komentář, opravila jsem to. Jenom moc nerozumím tomuto: "# Tady je super, že ta data načítáš jen jednou. Kdybys to chtěla dělat opakovaně pro každý nalezený subjekt, tak to bude hodně pomalé data = '{"kodCiselniku": "PravniForma", "zdrojCiselniku": "res"}' res = requests.post("https://ares.gov.cz/ekonomicke-subjekty-v-be/rest/ciselniky-nazevniky/vyhledat", headers=headers, data=data) ciselnik = res.json()['ciselniky'][0]['polozkyCiselniku']" Můžeš mi, prosím, popsat, jak to udělat, aby to v případě opakování nebylo pomalé? Díky moc.

pesikj commented 4 months ago

@JanaEsther Ahoj Jano, já to právě myslel tak, že ve tvé verzi to pomalé není, ale je to zcela v pořádku.

Pomalé by bylo, kdybys uvnitř cyklu pokaždé poslala požadavek na API, stáhla si číselníky a hledala v nich tu aktuální právní formu. To znamená, že bys pokaždé stáhla ta samá data. Určitě to není případ tvého programu, proto jsem tě za to chválil, ale ono to k tomu možná trošku svádí. :-)