C#의 null-coalesing 연산자와 동등한 Python이 있습니까?
C#에 null-coalesing 연산자가 있습니다.??
할당 시 간단한(짧은) 늘체크를 가능하게 하는 ) 。
string s = null;
var other = s ?? "some default value";
비단뱀과 동등한 것이 있나요?
제가 할 수 있는 건
s = None
other = s if s else "some default value"
더 방법은 s
other = s or "some default value"
그럼 어떻게 요, 해야 할까요?or
오퍼레이터가 동작합니다.부울 연산자이므로 부울 컨텍스트에서 작동합니다.값이 부울이 아닌 경우 연산자의 목적을 위해 부울로 변환됩니다.
에 주의:or
하지 않는 은 「」뿐입니다.True
★★★★★★★★★★★★★★★★★」False
대신 첫 번째 피연산자가 true로 평가되면 첫 번째 피연산자를 반환하고 첫 번째 피연산자가 false로 평가되면 두 번째 피연산자를 반환합니다.
은 " " " 입니다.x or y
x
True
사실대로 말하다않으면 됩니다.y
대부분의 경우 이는 C'의 늘 결합 연산자와 동일한 목적으로 기능하지만 다음 점에 유의하십시오.
42 or "something" # returns 42
0 or "something" # returns "something"
None or "something" # returns "something"
False or "something" # returns "something"
"" or "something" # returns "something"
를 사용하는 s
(의) 나 (의) None
가 멤버를 한)__nonzero__()
★★★★★★★★★★★★★★★★★」__len__()
연산자와 을 사용하는 합니다).
Python은 Python을 사용합니다. 값이 false로 에 이를 하여 "false"를 사용하지 않고 수 .None
을 사용하다
일부 언어에서는 이러한 행동을 엘비스 오퍼레이터라고 합니다.
엄밀히 말하면
other = s if s is not None else "default value"
않으면, 「」가 됩니다.s = False
될 것이다"default value"
을 사용법
이것을 짧게 하려면 , 다음의 순서에 따릅니다.
def notNone(s,d):
if s is None:
return d
else:
return s
other = notNone(s, "default value")
첫 번째 가 아닌.None
:
def coalesce(*arg):
return reduce(lambda x, y: x if x is not None else y, arg)
# Prints "banana"
print coalesce(None, "banana", "phone", None)
reduce()
불필요하게 될 수 .None
을 사용하다
def coalesce(*arg):
for el in arg:
if el is not None:
return el
return None
다음과 같은 둘 이상의 null 조건부 연산을 체인으로 해야 하는 경우:
model?.data()?.first()
풀 수 있는 가 아닙니다.or
또, 이것으로는 해결할 수 없습니다..get()
이와 유사한 할 수 없음) 사전 유형(또는 중첩할 수 없음)이 합니다.getattr()
NoneType none none none none 。
언어에 늘 병합을 추가하는 것을 고려하는 관련 PEP는 PEP 505이며 문서와 관련된 논의는 python-ideas 스레드에 있습니다.
이게 정답인 건 알지만, 딕트 같은 오브젝트를 다룰 때는 다른 옵션이 있어요.
다음과 같은 개체가 있는 경우:
{
name: {
first: "John",
last: "Doe"
}
}
다음을 사용할 수 있습니다.
obj.get(property_name, value_if_null)
예를 들어 다음과 같습니다.
obj.get("name", {}).get("first", "Name is missing")
추가에 의해{}
기본값으로 "name"이 없으면 빈 객체가 반환되어 다음 get으로 전달됩니다.이것은 C#의 null-safe-navigation과 비슷합니다.이것은 다음과 같습니다.obj?.name?.first
.
단일 값에 대해 @Bothwells answer(제가 선호하는)에 추가하여 함수 반환 값의 늘 할당을 체크하기 위해 새로운 walrus-operator(python3 이후)를 사용할 수 있습니다.8):
def test():
return
a = 2 if (x:= test()) is None else x
따라서,test
(와 같이) 함수를 두 번 평가할 필요가 없습니다.a = 2 if test() is None else test()
)
Juliano가 "or"의 행동에 대해 대답한 것 외에: "빠르다"
>>> 1 or 5/0
1
그래서 가끔은 이게 유용한 지름길이 될 수도 있어요.
object = getCachedVersion() or getFromDB()
@Huh Bothwell, @mortehu, @glgl의 답변에 대해.
테스트용 데이터 세트 설정
import random
dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]
구현 정의
def not_none(x, y=None):
if x is None:
return y
return x
def coalesce1(*arg):
return reduce(lambda x, y: x if x is not None else y, arg)
def coalesce2(*args):
return next((i for i in args if i is not None), None)
테스트 기능을 하다
def test_func(dataset, func):
default = 1
for i in dataset:
func(i, default)
python 2.7을 사용한 Mac i7 @2.7Ghz의 결과
>>> %timeit test_func(dataset, not_none)
1000 loops, best of 3: 224 µs per loop
>>> %timeit test_func(dataset, coalesce1)
1000 loops, best of 3: 471 µs per loop
>>> %timeit test_func(dataset, coalesce2)
1000 loops, best of 3: 782 µs per loop
확실히not_none
함수는 OP의 질문에 올바르게 응답하고 "falsy" 문제를 처리합니다.그것은 또한 가장 빠르고 읽기 쉽다.많은 곳에서 논리를 적용한다면, 그것은 분명히 최선의 방법이다.
반복 가능한 첫 번째 null 이외의 값을 찾는 데 문제가 있는 경우 @mortehu의 응답을 참조하십시오.그러나 OP와는 다른 문제에 대한 해결책이지만, 이 문제를 부분적으로 처리할 수 있습니다.반복 가능하고 기본값을 사용할 수 없습니다.마지막 인수는 반환된 기본값이지만, 이 경우 반복 가능한 값이 아니며 마지막 인수가 기본값인 것도 분명하지 않습니다.
그럼 아래도 할 수 있지만, 난 여전히 그걸 사용할 거야not_null
를 참조해 주세요.
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
이 문제에 대한 실행 가능한 해결책을 찾기 위해 우연히 이곳에 온 저와 같은 분들을 위해 변수가 정의되지 않았을 때, 제가 얻은 가장 가까운 것은 다음과 같습니다.
if 'variablename' in globals() and ((variablename or False) == True):
print('variable exists and it\'s true')
else:
print('variable doesn\'t exist, or it\'s false')
글로벌 체크인을 할 때는 문자열이 필요하지만 이후 값을 체크할 때는 실제 변수가 사용됩니다.
변수 존재에 대한 자세한 내용:변수가 존재하는지 확인하려면 어떻게 해야 합니까?
Python has a get function that its very useful to return a value of an existent key, if the key exist;
if not it will return a default value.
def main():
names = ['Jack','Maria','Betsy','James','Jack']
names_repeated = dict()
default_value = 0
for find_name in names:
names_repeated[find_name] = names_repeated.get(find_name, default_value) + 1
사전에서 이름을 찾을 수 없는 경우 default_value를 반환하고 이름이 존재하는 경우 기존 값 1을 추가합니다.
이것이 도움이 되기를 바란다
아래의 두 가지 기능은 많은 가변 테스트 케이스를 다룰 때 매우 유용하다는 것을 알게 되었습니다.
def nz(value, none_value, strict=True):
''' This function is named after an old VBA function. It returns a default
value if the passed in value is None. If strict is False it will
treat an empty string as None as well.
example:
x = None
nz(x,"hello")
--> "hello"
nz(x,"")
--> ""
y = ""
nz(y,"hello")
--> ""
nz(y,"hello", False)
--> "hello" '''
if value is None and strict:
return_val = none_value
elif strict and value is not None:
return_val = value
elif not strict and not is_not_null(value):
return_val = none_value
else:
return_val = value
return return_val
def is_not_null(value):
''' test for None and empty string '''
return value is not None and len(str(value)) > 0
언급URL : https://stackoverflow.com/questions/4978738/is-there-a-python-equivalent-of-the-c-sharp-null-coalescing-operator
'source' 카테고리의 다른 글
독립 실행형 전체 텍스트 검색 서버 선택: 스핑크스 또는 SOLR? (0) | 2022.11.16 |
---|---|
로컬 phpMyAdmin 클라이언트를 사용하여 원격 서버에 액세스하는 방법 (0) | 2022.11.16 |
Swing GUI에 공백 공간 제공 (0) | 2022.11.16 |
Java에서 기본 문자 집합/인코딩을 찾는 방법 (0) | 2022.11.16 |
POSTMAN 요청을 Curl로 변환 (0) | 2022.11.16 |