source

C#의 null-coalesing 연산자와 동등한 Python이 있습니까?

manycodes 2022. 11. 16. 21:30
반응형

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 yxTrue사실대로 말하다않으면 됩니다.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

반응형