facebook / facebook/pyrefly

bad-argument-type on Annotated pydantic fields with custom schema

Open
#2,586 4 comments 0 reactions 0 assignees View on GitHub
help wanted pydantic
Dominant language
Rust
Stars
7k
Forks
516
PR merge metrics
No merged PRs in 30d

Description

### Describe the Bug

When running pyrefly check on this file: https://github.com/psalvaggio/scientific_pydantic/blob/main/tests/numpy/test_dtype.py#L22

I expect line 22 to be OK, but it actually gives:

```
[Pyrefly] Argument `Literal['>i4']` is not assignable to parameter `dtype` with type `dtype[Any]` in function `DefaultModel.__init__`
```

Background:

This is a library I am working on that has a number of pydantic adapters for scientific types. The one I linked here is for `numpy.dtype`, but the issue is similar on a number of other ones.

The field is annotated like:

```python
dtype: ty.Annotated[np.dtype, DTypeAdapter()]
```

where `DTypeAdapter()` make a custom schema for the `np.dtype`. This particular schema is a plain validator that takes `Any` and either converts to a dtype or raises an exception, resulting in a validation error.

I would expect `pyrefly` to take `Any` for `dtype` in the model constructor, but it instead is constraining to `np.dtype`.

I think if there is a custom type in an `Annotated` field that implements `__get_pydantic_core_schema__`, then `pyrefly` should probably be fairly lax on the constraints for the corresponding keyword argument.

Happy to discuss or provide more details.

### Sandbox Link

https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSIEAtsbgE4AuABA6cROgOZOpwukAddEOq1GTMpgwMIAYyFg6uKhNJT0M2YQBWcXOgD6cWQAsYVVE1H1mAKT3oAyqfOoAaqigBXGAqUrJaTkDWXoYKxobJlC6GCMXCyERMH5CABUATQAFAFEDAGEACRz8gGkASQA5AHFEISYGiLFmdC8aUh4%2BdGIk4XRZKF4%2BABE0thgAQSliBhg6OvRGpgEQFZWstSDZHmnZuiYweiZW9sJMVmJfPqWAJS8NanCAN08fRGO2sjOLq6XbRwA8pUmLFiLE4DANKgZPp3udxoQ4Ax9gAKGCETiEJgAcgAPGAABzYgA0OIAPhAACzYgCU9Uaa1Wq2ujQAAgMhlQYAwTLhMPSGpgYCkDAZONyDIEHrIQmF4mYLKKUQKltEoHBiSqlkZcF46LI4j93j8ANqsQgTdCkAC6msWqoaBhMGEwsHmqnUmkI1W5%2BTCzgVqEKLrddqWNKYAFoAHzROXGQOEP2xAOuBYOhqMlY%2B5g88JSzRMBOuA5HHkQPg-LPMjMg7l6xYxOLFiyEdC4AwcQ6SwYcAwvKAQKQMegGMD3WQw9DK%2B21hoDOCEfueIfQmBhucNCF0CArgBe0Ig%2BgAvE35a4SL3DNvd4O93MxxOp0YHy3UDPNw6F0ub-v11qMxpDcHTpFkGlZJFD1kLkeT5FUhRFAdV1mFEBzeVJLVICMY2WEBum%2BcYVnTDNrHEE4yE6Y4ejA1UIBSCsOEg-oYFQ151yogjLhpYjN1iBgGyYNCrgAhpkVIHi5z4gT8PhS5WO8GBQNrGB8ANGYmByVSYBmI9Fl4JgVNkCTayoOBuGPA4VnKdAkMwD52iYWSYHeYAhIAQjoABfNZZ0k1AK3CDwFJyOglDoFFTM4CNFGUAzVN6JYIIYKCYN5flfIQpgXx3P95PQlYZKrEBsNjJF5hEut%2BLoRYhMRZEEsaTLRXFBhJU2aUDF0fRz0VAwPwzCEoDAYDVVlWIetQd4zzfJN-QSVARu1Z0sDdd4Czkb1uXsfRUwsYMVrmEaSqYbanHmoK3gq6sfXQOY1xOwFgTfUt9jzY4pFC1AOkgGAoH5JkfNrLrr3mpgLPNWReAYZUQEwOQGBWUlpvmuq6AmlEaSUjNgYmk0ViFYwdx0-QVmtMHcMqNoNkcoqKqk6rUkhpEYdO3b3DYxGmBxt9QKEDk4BGYVUC8KAGAAWT5X6UXWrQACFeBgCWhSgbiVWrNJ4GYKhJagasGsFI0MPQdtktmTATUK8ZSVGcYplQGY5gx61enwcnhiFkXxZ1lEnOPFZoypFYaRAYkQC8GR1RIchEBAABiJgAFUI4gVgDifXS4F6TLDjoCxWpObBHfwd4OAYY6yok%2BnFjAFZKaoQv3WAfBvOZEOQDIWIwCgUhCBHKgoAoeONk77uixdPBXdCdBIE4PVD30QghHjxwYHCEwGAYYg4EQAB6HeO%2BFbvCHoTgd8hHfMFwWQ4B3qeZ7nqcd5engXmgVBsFgONp4gWe6HnxZcDE3QIuIQZBYLoEjE8OYcBdLkxWAAZkIAARgAEw%2BRAJ5UOqBJwQCgQAMWgDACgaAsATyjhgoAA

### (Only applicable for extension issues) IDE Information

_No response_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.