Как я могу реорганизовать этот код на Python [duplicate]

Симон Моурир дал этот пример :

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

, где unboxing преобразование (литье) из object (или из одного из классов System.ValueType или System.Enum или из типа интерфейса) - тип значения (кроме Nullable<>) сам по себе дает NullReferenceException.

В другом направлении конверсия бокса из a Nullable<>, которая имеет HasValue, равную false , на ссылочный тип, может дать ссылку null, которая затем может привести к NullReferenceException. Классический пример:

DateTime? d = null;
var s = d.ToString();  // OK, no exception (no boxing), returns ""
var t = d.GetType();   // Bang! d is boxed, NullReferenceException

Иногда бокс происходит по-другому. Например, с помощью этого не общего метода расширения:

public static void MyExtension(this object x)
{
  x.ToString();
}

следующий код будет проблематичным:

DateTime? d = null;
d.MyExtension();  // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.

Эти случаи возникают из-за специальных правил, используемых во время выполнения при боксе Nullable<> экземпляров.

60
задан Yugal Jindle 23 August 2011 в 13:02
поделиться

7 ответов

регулярное выражение регулярного URL-адреса django:

regex = re.compile(
        r'^(?:http|ftp)s?://' # http:// or https://
        r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
        r'localhost|' #localhost...
        r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
        r'(?::\d+)?' # optional port
        r'(?:/?|[/?]\S+)$', re.IGNORECASE)

print re.match(regex, "http://www.example.com") is not None   # True
print re.match(regex, "example.com") is not None              # False
49
ответ дан Basj 4 September 2018 в 08:40
поделиться

note - lepl больше не поддерживается, извините (вы можете использовать его, и я думаю, что приведенный ниже код работает, но он не получит обновлений).

rfc 3696 http://www.faqs.org/rfcs/rfc3696.html определяет, как это сделать (для http-адресов и электронной почты). Я выполнил свои рекомендации в python, используя lepl (библиотека парсеров). см. http://acooke.org/lepl/rfc3696.html

для использования:

> easy_install lepl
...
> python
...
>>> from lepl.apps.rfc3696 import HttpUrl
>>> validator = HttpUrl()
>>> validator('google')
False
>>> validator('http://google')
False
>>> validator('http://google.com')
True
8
ответ дан andrew cooke 4 September 2018 в 08:40
поделиться

На самом деле, я думаю, что это лучший способ.

from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

val = URLValidator(verify_exists=False)
try:
    val('http://www.google.com')
except ValidationError, e:
    print e

Если вы установите verify_exists на True, он действительно проверит, существует ли URL-адрес, иначе он просто проверит,

edit: ah yeah, этот вопрос является дубликатом этого: Как проверить, существует ли URL с валидаторами Django?

95
ответ дан Community 4 September 2018 в 08:40
поделиться

Я приземлился на этой странице, пытаясь понять разумный способ проверки строк как «правильных» URL-адресов. Я разделяю здесь свое решение с помощью python3. Никаких дополнительных библиотек не требуется.

Если вы используете python2, см. https://docs.python.org/2/library/urlparse.html .

См. https://docs.python.org/3.0/library/urllib.parse.html , если вы используете python3 как я.

import urllib
from pprint import pprint

invalid_url = 'dkakasdkjdjakdjadjfalskdjfalk'
valid_url = 'https://stackoverflow.com'
tokens = [urllib.parse.urlparse(url) for url in (invalid_url, valid_url)]

for token in tokens:
    pprint(token)

min_attributes = ('scheme', 'netloc')  # add attrs to your liking
for token in tokens:
    if not all([getattr(token, attr) for attr in min_attributes]):
        error = "'{url}' string has no scheme or netloc.".format(url=token.geturl())
        print(error)
    else:
        print("'{url}' is probably a valid url.".format(url=token.geturl()))

ParseResult (схема = '', netloc = '', path = 'dkakasdkjdjakdjadjfalskdjfalk', params = '', query = '', fragment = '')

ParseResult (схема = 'https', netloc = ' stackoverflow.com ', path =' ', params =' ', query =' ', fragment =' ')

Строка' dkakasdkjdjakdjadjfalskdjfalk 'не имеет схемы или netloc.

' https://stackoverflow.com ', вероятно, действительный url.

Вот более краткая функция:

import urllib

min_attributes = ('scheme', 'netloc')


def is_valid(url, qualifying=None):
    qualifying = min_attributes if qualifying is None else qualifying
    token = urllib.parse.urlparse(url)
    return all([getattr(token, qualifying_attr)
                for qualifying_attr in qualifying])
6
ответ дан DMfll 4 September 2018 в 08:40
поделиться

Используйте пакет validators :

>>> import validators
>>> validators.url("http://google.com")
True
>>> validators.url("http://google")
ValidationFailure(func=url, args={'value': 'http://google', 'require_tld': True})
>>> if not validators.url("http://google"):
...     print "not valid"
... 
not valid
>>>

Установите его с помощью pip (pip install validators).

76
ответ дан Jabba 4 September 2018 в 08:40
поделиться

EDIT. Как указано в @Kwame, код выполняет проверку URL-адреса, даже если te .com, .co нет.

Это просто и работает:

So min_attr имеет основную строку, которая должна присутствовать для определения URL-адреса, то есть http:// и google.com.

urlparse.scheme хранит http:// и

urlparse.netloc сохранить доменное имя google.com

all() возвращает значение true, если все переменные внутри него возвращают true. Поэтому, если присутствуют result.scheme и result.netloc, URL-адрес действителен и, следовательно, возвращает True.

from urlparse import urlparse
def url_check(url):

    min_attr = ('scheme' , 'netloc')
    try:
        result = urlparse(url)
        if all([result.scheme, result.netloc]):
            return True
        else:
            return False
    except:
        return False
2
ответ дан Padam Sethia 4 September 2018 в 08:40
поделиться

Истинная или False версия, основанная на ответе @DMfll:

try:
    # python2
    from urlparse import urlparse
except:
    # python3
    from urllib.parse import urlparse

a = 'http://www.cwi.nl:80/%7Eguido/Python.html'
b = '/data/Python.html'
c = 532
d = u'dkakasdkjdjakdjadjfalskdjfalk'

def uri_validator(x):
    try:
        result = urlparse(x)
        return result.scheme and result.netloc and result.path
    except:
        return False

print(uri_validator(a))
print(uri_validator(b))
print(uri_validator(c))
print(uri_validator(d))

Дает:

True
True
False
True
22
ответ дан SomeGuyOnAComputer 4 September 2018 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: