В ядре .NET вы должны делать это на уровне HttpClient, а не использовать объект ServicePointManager, например,
https://stackoverflow.com/a/44540071/1538039
Я ответил на похожий вопрос на этот вопрос здесь - https://stackoverflow.com / a / 55358543/1538039
Несмотря на то, что вы можете обойти проверку таким образом, неправильный подход, если вы управляете сервером. Вы в основном говорите: «Я настроил сервер так, что мой клиент не может установить доверие, потому что он не доверяет цепочке сертификатов. Чтобы обойти это, я собираюсь принять все ошибки, добавив некоторый код »
Лучшее решение - настроить сервер с сертификатом, которому клиент может доверять, и тогда все будет просто работать [ 1110]!
Во время разработки, работая локально, если вы хотите использовать самозаверяющий сертификат, вы можете установить его в качестве корневого ЦС, и все должно работать как положено.
Как только вы попадаете на стадию, когда вы не контролируете клиента, вы, очевидно, не можете просить об этом людей. Единственное, что нужно сделать, это правильно настроить сервер с сертификатом, которому клиент может доверять, используя что-то вроде letsencrypt для генерации сертификата.
Одно хорошее место для запуска путем получения iPython (easy_install ipython
) затем вводя по абсолютному адресу вокруг с заполнением клавишей Tab, ?
и dir
:
In [2]: dir {}
------> dir({})
Out[2]:
['__class__',
...
'keys',
'pop',
'popitem',
'setdefault',
'update',
'values']
In [3]: {}.update?
Type: dict
Base Class: <type 'dict'>
String Form: {}
Namespace: Interactive
Length: 0
Docstring:
dict() -> new empty dictionary.
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs.
dict(seq) -> new dictionary initialized as if via:
d = {}
for k, v in seq:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
(просто, например)
Так или иначе, Ваша проблема с проверкой ключей, распространенных между этими двумя словарями: существует несколько вещей рассмотреть (возможно, взгляд на set
класс?), но вот то, как я сделал бы это:
common_keys = [k for k in dict1 if k in dict2]
(т.е., "каждый ключ k
в dict1, если тот ключ находится также в dict2") (отмечают также, что тестирование на членство в словаре является O (1) операция, таким образом, это будет работать в O (|dict1 |))
править: хорошо, таким образом, это не решает проблему слияния двух dicts в один со списками... Но ответ Lott хорош для этого, или Вы могли использовать setdefault
метод:
new = {}
for (k, v) in dict1.items():
new.setdefault(k, []).append(v)
for (k, v) in dict2.items():
new.setdefault(k, []).append(v)
Попробуйте это:
import collections
merged = collections.defaultdict(list)
for k in d1:
merged[k].append( d1[k] )
for k in d2:
merged[k].append( d2[k] )
Это может быть тем, что Вы ищете.
Или возможно это.
import collections
merged = collections.defaultdict(set)
for k in d1:
merged[k].add( d1[k] )
for k in d2:
merged[k].add( d2[k] )
Я верю, вот то, что Вы хотите:
>>> d1={'key1':1, 'key2':2}
>>> d2={'key1':1, 'key2':'A', 'key4':4}
>>> d = {}
>>> d.update(d1)
>>> for i in d2:
if i in d and d2[i] != d[i]:
d[i] = [d[i], d2[i]]
else:
d[i] = d2[i]
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}
Вот некоторые хорошие ссылки:
http://www.diveintopython.org/getting_to_know_python/dictionaries.html
http://docs.python.org/tutorial/datastructures.html#dictionaries
Словари Python также работают во многом как ассоциативные массивы в PHP, если у Вас есть опыт на том языке.
Встроенная страница Types в документах Python также имеет хороший раздел по словарям, и раздел также имеет список в наличии функций для них:
http://docs.python.org/library/stdtypes.html#mapping-types-dict
хорошо, для Вашего первого случая, Вы могли бы хотеть помощника, который комбинирует два объекта в список двух объектов и два списка в один список, содержащий объекты из двух списков,
Это принимает, конечно, что Вы всегда объединяете ключи в списки, но Вы не хотите, чтобы Ваши ключи закончили тем, что были "списками списков"
def listify( obj ):
if type(obj) != type([]): return [obj]
else: return obj
def merge( v1, v2 ):
return listify(v1) + listify(v2)
#so now you can merge two dictionaries:
dict1 = dict(a = 2, b = 5, c = 7 )
dict2 = dict(b = 4, d = 9, f = 10 )
dikt = {}
for k in set( dict1.keys() + dict2.keys() ):
dikt[k] = merge( dict1.get(k, []), dict2.get(k, []) )
#resutls in:
# {'a': [2], 'c': [7], 'b': [5, 4], 'd': [9], 'f': [10]}
Можно заметить, dict.keys()
возвращает список ключей, set
возвращает список без дублирующихся объектов, таким образом, set( d1.keys(), d2.keys() )
объединение возвратов ключей d1 и d2
Вариация на ответ @SilentGhost (все другие ответы производят неправильные словари):
>>> d1 = dict(key1=1, key2=2)
>>> d2 = dict(key1=1, key2='A', key4=4)
>>> d = dict(d1)
>>> for k, v2 in d2.iteritems():
... v = d.get(k, None)
... d[k] = [v, v2] if v is not None and v != v2 else v2
...
>>> d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}
Возможно, это немного неудобно сделать, потому что структура данных, которую Вы пытаетесь создать, не является столь естественной, как это могло быть. Например, вместо того, чтобы иметь некоторые значения быть одинокими значениями и некоторыми быть списками, почему бы не сохранить все в списках? Например.
{'key1': [1], 'key2': [2, 'A'], 'key4': [4]}
Возможно в Python иметь набор смешанных типов данных, но Ваш код часто будет более чистым, если Вы сохраните это когерентным. При использовании этого вида структуры данных вставка так же легка как
# Inserting a (key, value) pair
if key in my_dict:
my_dict[key].append(value)
else:
my_dict[key] = [value]
Вот еще одна вариация.
d1 = {'key1'=1, 'key2'=2}
d2 = {'key1'=1, 'key2'='A', 'key4'=4)
d = d2
for k, v in d.iteritems():
... if k in d1.keys() and v!=d1[k]:
... d[k] = [d1[k], v2]
d
{'key2': [2, 'A'], 'key1': 1, 'key4': 4}