An open set is a union of open balls I am trying to prove that any open set in a metric space $X$ is a union of open balls. There are a few subtleties of the proof I am not fully sure on how to tackle. Here is my attempt.

Let $U \subset X$ be an open set. Therefore, for each $x \in U$, we can pick $r(x) > 0$ such that $B(x,r(x)) \subset U$. Then I claim that
$$
U = \bigcup\limits_{x \in U} B(x, r(x)). 
$$
By definition, $B(x, r(x)) \subset U$ for each $x \in U$, so $\bigcup\limits_{x \in U} B(x, r(x)) \subset U$. Furthermore, given $u \in U$, we have $u \in B(u, r(u)) \subset \bigcup\limits_{x \in U} B(x, r(x))$, giving the reverse inclusion.

I have three questions on this.
(a) I'm very tempted to immediately rule out the case $U = \emptyset$. This is vacuously true for the empty set because it is the union of zero open balls. I don't think I have to do this, however, because I've said "for each $x$, pick $r(x)$," but if I have no such $x$, I simply don't choose any $r(x)$, and my union is over zero open balls. Am I correct that my exact construction still holds?
(b) Am I correct to say "choose $r(x)$" instead of "there exists $r(x)$?" It seems there could be infinitely many such $r(x)$ and in order to construct this union, I have to choose a radius, and therefore make use of the axiom of choice.
(c) Am I correct that $r$, which I haven't explicitly defined (should I do so?) is a function $U \to \mathbb{R}^{>0}$? I've used it as a notational device to refer to "the radius corresponding to this $x$," but it is in some sense a function. I could have called it $r_x$ instead.
 A: For doubt (a), you can say that the empty set is a union of open balls. Namely, the empty union, or a union of zero open balls. You could also argue, perhaps, that the open ball $B(x;0)$ is the open set, if a zero is admissible for a radius in your definitions. Either way, it is fine.

For doubt (b), I think it is appropriate to say "there exists $r(x)$" in this context. You have the existence from the open set definition, after all. You don't need to pick a particular one and mess with the axiom of choice. Thereafter it is presumed that this quantity - this quantity which you gave the name $r(x)$ - is fixed as well. So ultimately this is a nonissue.
Though pedantically/logically, I would say to write only what you say or know from the preceding steps or external definitions and to think carefully about these. You don't know if you need to choose a particular $r(x)$, nor does anything thereafter require it. You are only given existence of some $r(x)$. So it's simpler for you to simply say "there exists an $r(x)$." Perhaps there's a few crossed wires with the more colloquial meaning of choosing it that you're getting?

Regarding doubt (c): at present, you have already explicitly defined $r$ (be it $r(x),r(u)$) as much as needed. There need not be some formal calculation. I'm not sure what you could gain from something more specific.
You are correct in that there is a function $r$ handling all of this behavior of giving us the $r(x)$ for $x$ in the background. After all, this radius depends on $x$. If your open set is $U$, and you send $x \in U$ to an applicable radius $r(x)$ where $B(x;r(x)) \subseteq U$, then $r$ is a function of sorts.
However, it need not be any one particular function. Think of $\Bbb R$ or $\Bbb R^2$; clearly many radii might work for any given $x$. Hence, by picking $r : U \to \Bbb R^{>0}$, you're implicitly fixing what radii each $x \in U$ is sent to. So if you want to focus on that sort of notion, you may wish to be careful about the implications of this.
One possible work-around is allowing multi-valued or many-to-one functions, or set-valued functions. You could, for instance, define
$$ P(U,x) := \{ r \in \Bbb R^{>0} \mid B(x;r) \subseteq U \} \qquad
\mathcal{P} := \{ P(U,x) \}_{x \in U}$$
and then define $r : U \to \cal P$ by $r(x) = P(U,x)$ and fix an arbitrary radius in that set for rest of the proof.
But I feel like this is ultimately all overthinking matters a bit much. You're simply taking $x$ and getting a guaranteed radius $r(x)$ - a radius which depends on the $x$ taken - so that the ball $B(x;r(x))$ centered at $x$  with this radius is contained in your open set. The formalities of what this function $r$ is or may be aren't of much concern, in my opinion.
$r_x$ is another acceptable notation, as you comment, but it is ultimately the same thing. Think of sequences: you might write their members as $a_1,a_2,\cdots$; formally, this is just a function $a : \Bbb N \to X$ for whatever space you're dealing with. We define the indexing notation $a_n$ to be $a(n)$ under more conventional notation. It's same with the $r_x$ in that respect; still a sequence (or rather a sequence-like object called a net, if you really want to dive into the details), just indexed by a different set here ($U$ in this case) which may be uncountable.
Personally I just prefer $r_x$ because it takes up less room, fewer keystrokes, and doesn't make this whole "$r$ is a function giving us a radius from a given $x$" deal as much of a focus.
