---
name: config_from_env
kind: function
lang: py
domain: infra
version: "1.0.0"
purity: impure
signature: "config_from_env(target_class: type) -> object"
description: "Crea una instancia de un dataclass poblada desde variables de entorno usando field metadata (env, required, default, secret). Soporta str, int, float, bool, list. Acumula todos los errores antes de lanzar ValueError."
tags: [config, env, dataclass, infra, python]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [os, dataclasses]
params:
  - name: target_class
    desc: "clase dataclass con field metadata declarando env, required, default y/o secret por cada campo"
output: "instancia del dataclass con todos los campos poblados desde env o defaults"
tested: true
tests:
  - "populate string desde env"
  - "populate int con conversion"
  - "populate bool true"
  - "populate float field"
  - "populate list comma separated"
  - "default usado cuando env no seteada"
  - "required sin valor lanza error"
  - "no dataclass lanza type error"
test_file_path: "python/functions/infra/config_from_env_test.py"
file_path: "python/functions/infra/config_from_env.py"
---

## Ejemplo

```python
from dataclasses import dataclass, field
from config_from_env import config_from_env

@dataclass
class AppConfig:
    host: str = field(default="localhost", metadata={"env": "HOST", "default": "localhost"})
    port: int = field(default=8080,        metadata={"env": "PORT", "default": "8080", "required": True})
    api_key: str = field(default="",       metadata={"env": "API_KEY", "required": True, "secret": True})
    tags: list = field(default_factory=list, metadata={"env": "TAGS", "default": "prod,stable"})

cfg = config_from_env(AppConfig)
print(cfg.port)   # 8080 o el valor de PORT
```

## Notas

Solo stdlib (os, dataclasses). Conversion de tipos: str sin cambio, int/float con parseo, bool desde "1"/"true"/"yes", list desde split por coma. El tag secret no tiene efecto en runtime. La funcion inspecciona todos los fields via dataclasses.fields() y solo procesa los que tienen metadata["env"].
