Это полезно для понимания списка в Python? - PullRequest
0 голосов
/ 24 мая 2018
import serial as ser
import serial.tools.list_ports as listport
import re

try:
    # VID regex
    regex_vplogVID = re.compile(r'{\S+}_VID')

    # I want to find COM port by using specific hwid
    port_device = [n.device for n in listport.comports() if re.findall(regex_vplogVID, n.hwid)]

    vplogserial = ser.Serial(port_device[0])

except Exception as e:
    print(e)

На самом деле, я начинающий программист, использующий python.Я хочу найти порт, используя уникальный hwid, но я думаю, что понимание списка неверно, потому что порт будет возвращен только один.

Использую ли я просто код for-loop?Пожалуйста, поделитесь своими комментариями.:) Спасибо за чтение.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Если действительно есть только одно совпадение, не используйте понимание списка.Вместо этого используйте обычный цикл for и break, когда найдете совпадение: тогда вы гарантированно, что будет только одно совпадение:

# I want to find COM port by using specific hwid  
regex_vplogVID = re.compile(r'{\S+}_VID')  
port_device = None
for port in listport.comports():
    if re.findall(regex_vplogVID, port.hwid):
       port_device = port.device
       break

Бонус: если вы хотите пойти дальше,Вы можете использовать идиому for-else, если нет совпадения, но это не так часто используемая и часто смущает людей:

# I want to find COM port by using specific hwid 
regex_vplogVID = re.compile(r'{\S+}_VID')   
for port in listport.comports():
    if re.findall(regex_vplogVID, port.hwid):
       port_device = port.device
       break
else:  # no break encountered
    raise ValueError("COM port not found")
# No need now to have a default of `None` and check for it
vplogserial = ser.Serial(port_device[0])
0 голосов
/ 24 мая 2018

Я бы использовал цикл for хотя бы потому, что вы можете прекратить итерации раньше, когда найдете уникальное устройство.

for n in listport.comports():
    if re.findall(regex_vplogVID, n.hwid):
        vplogserial = ser.Serial(n.device)
        break
...