On Fri, Aug 6, 2021, at 1:53 AM, Richard van der Hoff wrote:
> [Shiny new list address! This is exciting!]

[Yeah wow, I sure missed a lot stepping away for a weekend!]

> So... IReactorTCP.connectTCP claims that 'host' should be a 'bytes': 
> https://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.IReactorTCP.html#connectTCP
> 
> PosixReactorBase.connectTCP doesn't tell us what type it should be, 
> but, 
> via tcp.Connector, ends up using it to construct an IPv4Address, which 
> reckons it should be a 'str': 
> https://twistedmatrix.com/documents/current/api/twisted.internet.address.IPv4Address.html#host.
>  
> Connector also uses it to construct a tcp.Client, where it gets used as 
> part of tcp.Client.addr, which is again supposed to be a 'str'.
> 
> I think in practice, either works, but it looks like most things 
> *expect* it to be a 'str', with grudging support for 'bytes'. So my 
> impression is the definition of the interface is wrong. Any 
> thoughts/comments?

Yup, the interface is wrong. It's not the only one [1] [2]. I suspect that this 
is a Python 3 porting error. Hostnames and IP addresses are native strings in 
e.g. socket.socket and in practice that seems to be what they are in Twisted. I 
think Names is perhaps the main exception, but then you'd kinda expect it to be 
lower level.

i think that we should treat this as a simple bug and correct the type. Any 
IReactorTCP implementation that strictly implemented the interface-as-written 
by _only_ accepting bytes wouldn't work, so there isn't any compatibility 
hazard.

Would you file a ticket?

[1]: https://twistedmatrix.com/trac/ticket/9713
[2]: https://twistedmatrix.com/trac/ticket/7302

> (While we're at it, IReactorTCP also claims that 'timeout' and 
> 'bindAddress' are required parameters, even though all the 
> implementations make them optional.)

This one seems less clear-cut to me. I think that you could use connectTCP 
through and endpoint like IHostnameEndpoint and they'd always be passed.

Perhaps optional parameters are usually not a good idea for interfaces? I'm 
thinking of IAgent.request [3], where the optionality of the headers parameter 
leads to a lot of similar-looking conditional code in every implementer. Best 
to hoist that logic to a top-level facade (e.g., Treq).

[3]: 
https://twistedmatrix.com/documents/current/api/twisted.web.iweb.IAgent.html#request

---Tom
_______________________________________________
Twisted mailing list -- twisted@python.org
To unsubscribe send an email to twisted-le...@python.org
https://mail.python.org/mailman3/lists/twisted.python.org/
Message archived at 
https://mail.python.org/archives/list/twisted@python.org/message/577PHKAZKYU47DKHNLPSWSAWZ5FH2BT7/
Code of Conduct: https://twisted.org/conduct

Reply via email to