from functools import reduce, wraps
def silenced(*exceptions, typed=False):
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
try:
return f(*args, **kwargs)
except exceptions as exc:
if typed:
return exc.__class__
return None
return wrapper
return decorator
@silenced(IndexError, KeyError)
def item_getter(container, key):
if container is not None:
return container[key]
exampe = {
'Building': {
'Flat': {
'Flat_1': {
'App_1': 3,
'App_2': 5
},
'Flat_2': {
'App_3': 1,
'App_4': 3
}
}
}
}
path = ['Building', 'Flat', 'Flat_2', 'App_4']
value = reduce(item_getter, path, example)
print(value)
printf
находится в библиотеке libmsvcrt.a
. Чтобы иметь возможность использовать printf
, нужно слинковать test.o
с libmsvcrt.a
. Впрочем, этим дело не ограничивается, чтобы хотя бы запустить программу, необходимо очень много вспомогательного кода. Параметры линковщика могут выглядеть примерно так для обычного "hello world":ld -LC:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0
-LC:/MinGW/x64/mingw64/bin/../lib/gcc
-LC:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/lib/../lib
-LC:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../lib
-LC:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/lib
-LC:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../..
C:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o
C:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/crtbegin.o
test.o
-lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32
-luser32 -lkernel32 -liconv -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt
C:/MinGW/x64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/7.1.0/crtend.o