There are three main files in my code:

config.yml: contains connection address, ports, and so on.
modules > fetchers.py: contains different fetching functions that fetches different content from apis that requires connection info from the config.yml
main.py: uses fetchers' functions

What I am currently doing is, the main.py reads config.yml to get connection info, and passes connection info as params to the fetchers function every time.
However, I am thinking if I could let the fetchers.py to read and get the connection info, so that I could avoid passing bunch of params everytime I calls those fetchers function. If by doing so, will the fetchers.py reads config file whenever I calls its functions? Does that means if I called twice, the config file will be read twice and made extra costs of disk IO?
It depends on how the functions in fetchers.py read the configuration. Code on module-level is usually executed just once but if you would e.g. read the config files within the functions it would of course read them every time.
I would still highly recommend to keep configuration management (e.g. loading them from a file) and functions that work with that configuration separate. NamedTuple classes are e.g. an easy way to group several function arguments regarding configuration into one.
Using functions from a module that requires variables from a config file